day3 HDU 1455 Sticks
来源:互联网 发布:js md5加密 php解密 编辑:程序博客网 时间:2024/05/20 04:49
题目要求是拼木棍,求能拼出的最短长度。因为选择比较多,考虑长度从小到大进行DFS,但是这道题有很多可以剪枝的地方。
1.对数组进行排序,从较大的木棍开始拼
2.长度一定是可以整除总长度的
3.长度最长不会超过总长度的一半
4.注意随时进行判断,如果剩下的木棍无法拼成了就立即退出。
#include"iostream"#include"algorithm"using namespace std;int v[100],s[100];int w;int n,sum,k;int cmp(int a,int b){ return a>b;}int dfs(int les,int x,int sl){ if(les==0) { sl-=k; if(sl==0) return 1; int i=0; while(v[i]) i++; v[i]=1; if(dfs(k-s[i],i+1,sl)) return 1; v[i]=0; sl+=k; } else { for(int i=0;i<n;i++) { if(i>0&&(s[i]==s[i-1]&&!v[i-1])) continue; if(!v[i]&&s[i]<=les) { les-=s[i]; v[i]=1; if(dfs(les,i,sl)) return 1; v[i]=0; les+=s[i]; if(s[i]==les||les==k) break; } } } return 0;}int main(){ while(1) { cin>>n; if(n==0) break; sum=0; for(int i=0;i<n;i++) { cin>>s[i]; sum+=s[i]; v[i]=0;} sort(s,s+n,cmp); int flag=0; for(k=s[0];k<=sum/2;k++) { if(sum%k==0) { if(dfs(k,0,sum)) { flag=1; cout<<k<<endl; break; } } } if(flag==0) cout<<sum<<endl; //cout<<k<<endl; }}
0 0
- day3 HDU 1455 Sticks
- HDU 1455 Sticks
- Hdu 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- 【DFS】hdu 1455 Sticks
- Sticks hdu 1455
- hdu 1455 sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 hdu 1455 Sticks
- 20160802
- iOS- 响应者链条简介
- 2016多校训练Contest5: 1012 World is Exploding hdu5792
- python核心编程学习笔记-2016-08-02-02-模块动态导入
- 2017年网易内推笔试题
- day3 HDU 1455 Sticks
- Educational Codeforces Round 15, problem: (C) Cellular Network
- MYSQL使用细则
- 并查集
- TCP、UDP、IP 协议分析
- 开个博吧
- Android实用视图动画及工具系列之一:简单的载入视图和载入动画
- Linux中系统调用和库函数调用的区别
- resin几个简单启动命令