小木棒HDU1455(DFS+剪枝)
Posted --hpy-7m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小木棒HDU1455(DFS+剪枝)相关的知识,希望对你有一定的参考价值。
题意:HDU1455
给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少.
思路:
见代码:https://www.cnblogs.com/fqfzs/p/9911110.html参考自
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 70; 4 const int INF = 0x3f3f3f3f; 5 int n, sumv, target, aim;//target表示目标的棍子个数,aim表示目标的棍子长度,sumv为所有木棍总长度 6 int stick[maxn], vis[maxn];//vis数组标记 ,stick存储输入的木棒长度 7 bool cmp(int a, int b) { 8 return a > b; 9 } 10 bool dfs(int cnt, int len, int pos) { 11 if(cnt == target) return true;//根数对上就返回 退出dfs 12 if(len == aim) return dfs(cnt+1, 0, 0); //当拼完一根后,继续拼下一根 13 for(int i = pos; i < n; i++) {//从大到小排序后,按顺序搜索 14 if(!vis[i] && len+stick[i] <= aim) { 15 vis[i] = 1; 16 if(dfs(cnt, len+stick[i], i+1)) return true; 17 vis[i] = 0; //只有失败才会运行到下面,否则是直接返回的 18 if(len == 0) return false; //如果第一根时失败 剪枝 19 while(i+1 < n && stick[i+1] == stick[i]) i++; //如果下一根长度跟当前的失败的长度一样,剪枝 20 } 21 } 22 return false; 23 } 24 int main() { 25 while(~scanf("%d", &n), n) { 26 sumv = 0; 27 for(int i = 0; i < n; i++) { 28 scanf("%d",&stick[i]); 29 sumv += stick[i]; 30 } 31 sort(stick, stick+n, cmp); 32 int ans = 0; 33 for(int i = stick[0]; i <= sumv; i++) {//拼好后的木棒长度只会在stick[0]和总长度之间 34 if(sumv % i == 0) { 35 memset(vis, 0, sizeof(vis)); 36 aim = i; 37 target = sumv / aim; 38 if(dfs(0, 0, 0)) { 39 ans = aim; 40 break; 41 } 42 } 43 } 44 printf("%d ",ans); 45 } 46 return 0; 47 }
以上是关于小木棒HDU1455(DFS+剪枝)的主要内容,如果未能解决你的问题,请参考以下文章