hdoj1455 poj1011 nyoj293 Sticks【DFS+剪枝】
来源:互联网 发布:linux网卡配置图 编辑:程序博客网 时间:2024/05/17 23:14
Sticks
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 128649 Accepted: 30149
Description
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 help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.
Input
The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.
Output
The output should contains the smallest possible length of original sticks, one per line.
Sample Input
95 2 1 5 2 1 5 2 141 2 3 40
Sample Output
65
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;int stick[70];int vis[70];int cont,nowcount;int len;int num;bool cmp(int a,int b){return a>b;}bool dfs(int k,int leftlen){if(leftlen==0){nowcount++;if(nowcount==cont)return true;int i=0;while(vis[i])i++;vis[i]=1;if(dfs(i+1,len-stick[i]))return true; vis[i]=0;nowcount--;return false;//若当前最长的木棍不匹配则不能匹配 }for(int i=k;i<num;++i){if(!vis[i]&&stick[i]<=leftlen){if(stick[i]==stick[i-1]&&!vis[i-1])continue;//前一个相同长度的没有匹配则以后相同的必定不会匹配 vis[i]=1;if(dfs(i+1,leftlen-stick[i]))return true;vis[i]=0;if(leftlen-stick[i]==0)return false;//当一根木棍已经匹配但不满足条件则不能完成匹配 }}return false;}int main(){int i,j;while(scanf("%d",&num),num){int sum=0;for(i=0;i<num;++i){scanf("%d",&stick[i]);sum+=stick[i];vis[i]=0;}sort(stick,stick+num,cmp);int flag=0;vis[0]=1;for(len=stick[0];len<=sum/2;++len)//len最大为sum的1/2 {if(sum%len)continue;//sum必定为len的倍数 cont=sum/len;nowcount=0;if(dfs(1,len-stick[0])){printf("%d\n",len);flag=1;break;}}if(flag==0)printf("%d\n",sum);}return 0;}
0 0
- hdoj1455 poj1011 nyoj293 Sticks【DFS+剪枝】
- POJ1011-Sticks DFS+剪枝
- poj1011 Sticks(dfs+剪枝)
- POJ1011 Sticks DFS+剪枝
- POJ1011 Sticks【DFS+剪枝】
- poj1011 -- Sticks (DFS+剪枝)
- poj1011-Sticks dfs各种剪枝
- poj1011 Sticks DFS深度优先搜索+剪枝
- 【POJ1011】Sticks-DFS+调整法剪枝
- poj1011——Sticks(dfs+剪枝)
- POJ1011 Sticks 【剪枝】
- poj1011 Sticks(搜索+剪枝)
- poj1011 Sticks(搜索剪枝)
- poj1011 Sticks---dfs
- poj1011 Sticks DFS+回溯
- 【DFS搜索】poj1011 Sticks
- POJ1011 Sticks(dfs)
- 1poj1011(dfs剪枝)
- hdu 5318 The Goddess Of The Moon 矩阵快速幂
- 图论浅析--基础知识
- svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决
- Swift开发教程--如何对字符串进行md5加密
- 线性查找算法
- hdoj1455 poj1011 nyoj293 Sticks【DFS+剪枝】
- 慢慢学会总结
- hdu 2393(Higher Math)
- 在spfile中删除系统参数
- Java解析json学习记录
- PHP调用淘宝IP地址查询接口查询IP所在地信息实例
- 51nod1419
- HDOJ I Hate It 1754【线段树】
- 单选(RadioButton)复选(CheckBox)学习笔记