小木棒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+剪枝)的主要内容,如果未能解决你的问题,请参考以下文章

HDU_1455_dfs

3498 小木棍

POJ1011 木棒(dfs+剪枝)

POJ1011 木棒(dfs+剪枝)

AcWing 167. 木棒 dfs+剪枝

[dfs] aw167. 木棒(dfs剪枝与优化+分类讨论+思维+好题)