hdu 1455 sticks

经典剪枝题目,注释的别人代码。还是得自己多敲。反思,反思!

 1 #include "iostream"
 2 #include "algorithm"
 3 #include "memory.h"
 4 using namespace std;
 5
 6 int sticks[64],n,len,num;
 7 bool used[64];
 8
 9 bool cmp(int a,int b)
10 {
11     return a > b;
12 }
13
14 bool dfs(int cur,int left,int level)
15 {  //cur: 当前已经计算的木棒编号,left:该段还剩的长度,level:已经成功的木棒数
16     if (left == 0) {//匹配一根木棒成功
17         if (level == num-2)  return true;
18         for (cur = 0; used[cur];cur++);//找到下一个未访问过的长度
19         used[cur] = true;
20         if (dfs(cur+1,len-sticks[cur],level+1))
21             return true;
22         used[cur] = false;              //回溯
23         return false;
24     } else {
25             if (cur >= n-1) return false;
26             for (int i = cur;i < n; ++ i) {//剪枝
27                 if (used[i]) continue;      //访问过的长度
28                 if (sticks[i] == sticks[i-1] && !used[i-1]) continue; //相等的长度已经搜过的不搜
29                 if (sticks[i] > left) continue;                     //大于达到len的生育长度
30                 used[i] = true;
31                 if (dfs(i,left-sticks[i],level)) return true;
32                 used[i] = false;        //回溯
33             }
34         return false;
35     }
36 }
37 int main()
38 {
39     while (cin >> n,n) {
40         int sum = 0;
41         for (int i = 0;i < n; ++ i) {
42             cin >> sticks[i];
43             if(sticks[i]>50)
44             {
45                 n--;i--;continue;
46             }
47             sum += sticks[i];
48         }
49         sort(sticks,sticks + n,cmp);//剪枝
50         bool end = false ;
51         for (len = sticks[0]; len <= sum/2; len++) {
52             if (sum%len == 0) {     //剪枝
53                 used[0] = true;
54                 num = sum/len;
55                 if (dfs(0,len-sticks[0],0)) {
56                     end = true;
57                     cout << len << endl;
58                     break;
59                 }
60                 used[0] = false;    //回溯
61             }
62         }
63         if (!end) cout << sum << endl;
64         memset(used,0,sizeof(used));
65     }
66     return 0;
67 }

时间: 2024-10-15 15:55:34

hdu 1455 sticks的相关文章

HDU 1455——Sticks(神棍)

这题跟 HDU1518差不多 附上测试数据~~ 64 40 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40 40 25 39 46 40 10 4 40 40 37 18 17 16 15 40 40 40 40 40 40 40 40 46 40 37 32 10 47 4 42 56 61 23 5

hdu 1455 Sticks——dfs经典的题目

http://acm.hdu.edu.cn/showproblem.php?pid=1455 题意:几根长度的棍子被分成了很多半.问合成多个长度相同的棍子,棍子长度最小是多少. 题解:很明显是dfs.所以我们首先需要找到,这些棍子可能是多长,肯定是最长的棍子的长度到所有棍子长度和之间的某个长度.找到这些可能之后就直接按照这个长度开始搜.想法是搜到和为这个长度之后记录,然后重新再搜,一直到所有棍子都分配自后就完成了. 重要的剪枝:确定每次搜索的起始位置,这个一定是确定的!!!其次就是相同长度的棍子

hdu 1455 Sticks DFS 又是一个花样剪枝 ,累觉不爱

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6750    Accepted Submission(s): 1967 Problem Description George took sticks of the same length and cut them randomly until all parts becam

hdu 1455 hdu 1455 Sticks

思路还是很简单的,不过关键在于剪枝,用了几个不强力的剪枝,飘过~~~998ms #include<iostream> #include<algorithm> #include<cstring> #define maxn 65+5 using namespace std; int maxx,n,m,flag,l; int mapp[maxn]; int visit[maxn]; bool cmp(int x,int y) { return x>y; } void d

DFS/poj 1011/hdu 1455 Sticks

1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int n,tot,ans; 6 bool v[100]; 7 int a[100]; 8 bool cmp(int x,int y) 9 { 10 return x>y; 11 } 12 bool dfs(int now,int dep,int ans,int len) 13 { 14 if

hdu 1455 sticks(经典深搜+剪枝技巧)

 题意:有一堆的木棒,长度不一,它们是有一些整齐的木棒截断而成的,求最小的木棒原始长度. 思路很简单深搜,但是直接深搜的话会tle,首先可以对木棒长度进行排序从大到小,优先使用长度长的木棒,加入当前长度不符合,考虑下一个木棒 其次如果长度为零的时候选择木棒失败,那么直接退出,实测加上这一剪枝就可以ac,这一剪枝可以帮助我们尽可能的在靠近树根处剪枝,所以优化效果很明显. 然后是如果这次选择的木棒长度和上次失败时的一样,那么剪枝. #include<cstdio> #include<cs

Sticks HDU - 1455 (未完成)

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please h

hdoj 1455 Sticks 【dfs】

题意:找最短的木棍能够组成的长度, hdoj  1518 的加强版 代码: #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; #define M 70 int s[M], vis[M]; int n, ans; int cmp(int a, int b) { return a > b; } int dfs(int cou, int cur, int pos) {

HDU 1455(DFS_F题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1455 ----------------------------------------------------------------------------------- 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出可能的原始木棒的最小长度. 思路: 1.首先降序排列,因为木棍越长,可能的约束越大. 2.木棍的总长度除以原来的木棍数量,一定整