hdu 1455 Sticks(DFS+剪枝)
2015-11-02 19:11
337 查看
原题链接:
hdu 1455
题目大意:
n个木棒,求原来木棒最短的长度(每个木棒等长且在数量上无限制,木棒可以未被折断过)。
思路:
DFS。三个参数,当前长度,当前遍历位置,当前已构成最短长度的个数。
注意剪枝。
从大到小排序,可以减少递归次数,不难理解。
详见代码:
hdu 1455
题目大意:
n个木棒,求原来木棒最短的长度(每个木棒等长且在数量上无限制,木棒可以未被折断过)。
思路:
DFS。三个参数,当前长度,当前遍历位置,当前已构成最短长度的个数。
注意剪枝。
从大到小排序,可以减少递归次数,不难理解。
详见代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=70; int sumlen,anslen,num,k; int sticks[MAXN]; bool vis[MAXN]; int n; bool cmp(int x,int y) { return x>y; } bool DFS(int ss,int ll,int pos) { if(ss==num) return true; for(int i=pos;i<n;i++) { if(vis[i]) continue; if(sticks[i]+ll==k) { vis[i]=true; if(DFS(ss+1,0,0))return true; vis[i]=false;//勿忘 } else if(sticks[i]+ll<k) { vis[i]=true; if(DFS(ss,ll+sticks[i],i+1)) return true; vis[i]=false; if(ll==0)return false;//ll==0说明遍历完一遍该树枝仍未用到,所以这种情况不存在 while(sticks[i]==sticks[i+1])i++;//因为已排序,当当前木棒长度不行时,长度相等的木棒也不行,所以跳过 } } return false; } int main() { while(scanf("%d",&n)!=EOF&&n) { memset(vis,0,sizeof(vis)); sumlen=0; for(int i=0;i<n;i++) { scanf("%d",&sticks[i]); sumlen+=sticks[i]; } sort(sticks,sticks+n,cmp); for(k=sticks[0];k<=sumlen;k++) { if(sumlen%k!=0)continue;//木棒长度相等 num=sumlen/k;//能构成多少个木棒 if(DFS(0,0,0)) { cout<<k<<endl; break; } } } return 0; }
相关文章推荐
- java--xiti
- gitHub管理代码
- hdu1420 Prepared for New Acmer (快速幂模)
- 制作一个简单的浏览器WebView的使用
- hdu1040 As Easy As A+B (排序)
- awk经典实例
- hdu2187 悼念512汶川大地震遇难同胞——老人是真饿了 (贪心)
- AdapterView和Adapter
- DTO及其处理
- adb server is out of date. killing... ADB server didn't ACK * failed to star
- 数组里的随机数问题
- Android 使用Messenger实现跨进程之间通信
- BestCoder Round #60 GT and sequence (排序)
- BestCoder Round #60 GT and numbers (模拟)
- Hadoop集群的回收机制
- 支线任务-3
- C#中的yield关键字
- codeblocks找不到openssl/md5.h头文件
- 集群搭建实例总结
- 新更新....llq原创考试第二题