poj-1011
来源:互联网 发布:android基站定位源码 编辑:程序博客网 时间:2024/04/27 22:44
题意:View Code
木棒复原,输入n,再输入n个木棒长度,求原来木棒长度最小为多少
解题思路:
dfs+回溯
具体代码:
#include<iostream>#include<algorithm>using namespace std;int n;int cmp(int a,int b){ if(a>b) return 1; else return 0;}int dfs(int *stick,bool *vist,int len,int initlen,int s,int num){ if(num==n) return true; int sample=-1; for(int i=s;i<n;i++) { if(vist[i]||stick[i]==sample) continue; vist[i]=true; if(len+stick[i]<initlen) { if(dfs(stick,vist,len+stick[i],initlen,i,num+1)) return true; else sample=stick[i]; } else if(len+stick[i]==initlen) { if(dfs(stick,vist,0,initlen,0,num+1)) return true; else sample=stick[i]; } vist[i]=false; if(len==0) break; } return false;}int main(){ while(cin>>n && n) { int *stick=new int[n]; bool *vist=new bool[n]; int sumlen=0; for(int i=0;i<n;i++) { cin>>stick[i]; sumlen+=stick[i]; vist[i]=false; } sort(stick,stick+n,cmp); int maxlen=stick[0];//所有木棒中最长的 bool flag=false; for(int initlen=maxlen;initlen<=sumlen-initlen;initlen++) { if(!(sumlen%initlen)&&dfs(stick,vist,0,initlen,0,0)) { cout<<initlen<<endl; flag=true; break; } } if(!flag) cout<<sumlen<<endl; delete stick; delete vist; } return 0;}
0 0
- poj 1011
- poj 1011
- POJ-1011
- POJ 1011
- poj 1011
- poj 1011
- POJ-1011
- poj 1011
- poj 1011
- poj 1011
- poj 1011
- POJ 1011
- POJ 1011
- POJ 1011
- POJ 1011
- poj 1011
- POJ 1011
- POJ 1011
- nyoj--Divideing Jewels
- nyoj--幸运三角形
- 揭秘谷歌网络基础设施十年演变过程
- poj-2312
- poj-1010(转)
- poj-1011
- poj-1020(填蛋糕)(转)
- poj-1022(四维模仿)(转)
- poj-1024(唯一最短路径)(转)
- poj-1069(三角形和六边形)(转)
- Spark技术实战之1--KafkaWordCount
- hdu-(1298手机相关 dfs+字典树)
- 枚举(黑白棋)
- POJ3253-Fence Repair-贪心-哈夫曼树