UVA 307Sticks(dfs搜索)
2017-02-20 00:35
260 查看
大体题意:
给你n个木棍,要求分配这个n 个木棍到x组,使得x组的木棍长度和都相同,问最小的长度和是多少?
思路:
直接搜索:
需要加很多剪枝才能过:
1.首先你枚举时,应该枚举组数,而不是长度和,否则循环会很长。
2.如果第一个木棍选完了,没找到合适的使它权值和为枚举的答案,就不可能有答案了。
3.如果第i个木棍能组成ans,但其余的不能了,也不能有答案了。
4.当长度小于ans时,前面的不用在循环了,直接从当前位置继续往后找就好了。
5.if else if 写成if else 的话,容易漏掉长度和 > ans的情况。。。。坑死了这里。。
给你n个木棍,要求分配这个n 个木棍到x组,使得x组的木棍长度和都相同,问最小的长度和是多少?
思路:
直接搜索:
需要加很多剪枝才能过:
1.首先你枚举时,应该枚举组数,而不是长度和,否则循环会很长。
2.如果第一个木棍选完了,没找到合适的使它权值和为枚举的答案,就不可能有答案了。
3.如果第i个木棍能组成ans,但其余的不能了,也不能有答案了。
4.当长度小于ans时,前面的不用在循环了,直接从当前位置继续往后找就好了。
5.if else if 写成if else 的话,容易漏掉长度和 > ans的情况。。。。坑死了这里。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500 + 7; int a[maxn], n, f, g, df; bool vis[maxn]; bool cmp(int& a,int& b){ return a > b; } bool dfs(int cur,int c,int pos,int len){ if (cur == f) { if (len == n)return true; return false; } for (int i = pos; i < n; ++i){ if (!vis[i]){ if (c+a[i] == g){ vis[i] = 1; if (dfs(cur+1,0,0,len+1)) return true; vis[i] = 0; return false; while(i+1 < n && a[i+1] == a[i])++i; } else if (c+a[i] < g){ vis[i] = 1; if ( dfs(cur,c+a[i],i+1,len+1) ) return true; vis[i] = 0; while(i+1 < n && a[i+1] == a[i])++i; } if (!pos)return false; } } return false; } int main(){ while (~scanf("%d",&n) && n){ int sum = 0; bool ok = 1; for (int i = 0; i < n; ++i) { scanf("%d",a+i); sum += a[i]; if (i){ if (a[i] != a[i-1])ok = 0; } } if (ok) { printf("%d\n",a[0]); continue; } sort(a,a+n,cmp); int ans = sum; for (int i = n - 1; i > 1; --i){ if (sum % i == 0 && sum / i >= a[0]){ f = i; g = sum/i; memset(vis,0,sizeof vis); if (dfs(0,0,0,0)){ ans = g; break; } } } printf("%d\n",ans); } return 0; } /** 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0 **/
相关文章推荐
- UVALive 5844 dfs暴力搜索
- uva11882 Biggest Number dfs搜索 剪很多枝
- 紫书搜索 习题7-2 UVA - 225 Golygons 搜索dfs
- UVa 10603 - Fill,经典倒水问题+隐式图搜索+dfs
- uva 784 Maze Exploration 染色 搜索水题 DFS
- UVa 129 Krypton Factor困难的串 (dfs 递归搜索)
- uva 784 Maze Exploration 染色 搜索水题 DFS
- UVALive 5107 dfs暴力搜索
- UVa 280 Vertex ( dfs搜索 水题 )
- UVA 725 除法(DFS搜索排列)
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- uva_572_八连块_图论_DFS搜索
- Kingdoms UVA - 12507 状压||dfs搜索+最小生成树
- 搜索(DFS+BFS)——UVA Live 6455
- UVA225 Golygons 【搜索, dfs】
- UVa 225 – Golygons [DFS+剪枝]
- UVA 572 搜索 初识BFS DFS
- POJ - 1321 棋盘问题(15.10.10 搜索专题)dfs
- UVALive - 3902 Network 无根树转为有跟树+搜索+贪心
- uva 524 - Prime Ring Problem(dfs)