hdu 1455 sticks
2014-12-09 01:34
246 查看
经典剪枝题目,注释的别人代码。还是得自己多敲。反思,反思!
View Code
#include "iostream" #include "algorithm" #include "memory.h" using namespace std; int sticks[64],n,len,num; bool used[64]; bool cmp(int a,int b) { return a > b; } bool dfs(int cur,int left,int level) { //cur: 当前已经计算的木棒编号,left:该段还剩的长度,level:已经成功的木棒数 if (left == 0) {//匹配一根木棒成功 if (level == num-2) return true; for (cur = 0; used[cur];cur++);//找到下一个未访问过的长度 used[cur] = true; if (dfs(cur+1,len-sticks[cur],level+1)) return true; used[cur] = false; //回溯 return false; } else { if (cur >= n-1) return false; for (int i = cur;i < n; ++ i) {//剪枝 if (used[i]) continue; //访问过的长度 if (sticks[i] == sticks[i-1] && !used[i-1]) continue; //相等的长度已经搜过的不搜 if (sticks[i] > left) continue; //大于达到len的生育长度 used[i] = true; if (dfs(i,left-sticks[i],level)) return true; used[i] = false; //回溯 } return false; } } int main() { while (cin >> n,n) { int sum = 0; for (int i = 0;i < n; ++ i) { cin >> sticks[i]; if(sticks[i]>50) { n--;i--;continue; } sum += sticks[i]; } sort(sticks,sticks + n,cmp);//剪枝 bool end = false ; for (len = sticks[0]; len <= sum/2; len++) { if (sum%len == 0) { //剪枝 used[0] = true; num = sum/len; if (dfs(0,len-sticks[0],0)) { end = true; cout << len << endl; break; } used[0] = false; //回溯 } } if (!end) cout << sum << endl; memset(used,0,sizeof(used)); } return 0; }
View Code
相关文章推荐
- HDU 1455 Sticks
- hdu1455 Sticks(搜索+剪枝+剪枝+.....+剪枝)
- HDU 1455 Sticks
- HDU 1455 Sticks(DFS,剪枝,原来木棒的至少长度)
- HDU 1455 POJ 1011 UVA 307 Sticks
- HDU 1455 Sticks(dfs+强剪枝)
- HDU 1455 Sticks(DFS+剪枝)
- hdu 1455 Sticks(经典搜索)
- hdu 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 Sticks
- hdu 1455 poj 1011 sticks
- hdu 1455 Sticks(DFS+剪枝)
- HDU - 1455 Sticks(深搜+剪枝)
- HDU 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks 解题报告
- HDU-1455 Sticks 经典dfs剪枝
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks