[c]HDOJ1455 dfs的应用

来源:互联网 发布:软件打包工具 编辑:程序博客网 时间:2024/05/22 07:50

http://acm.hdu.edu.cn/showproblem.php?pid=1455

题目标题:sticks

题目大意:给一些小木棒长度,它是由等长的若干木棒任意砍断所得到的。对于给定的一组小木棒,求出原始木棒的最小长度


这个题可以用dfs深搜来做,是一个比较经典的dfs题


#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int sign=0;int ssign=0;int lsign=0;int a[65]={0};bool ss[65]={0};int n;int now;bool dfs(int c,int cur,int pos){if(c==n) return true;int i;for(int i=pos;i<n;i++){if(ss[i]) continue;if(cur+a[i]<now){ss[i]=1;if(dfs(c+1,cur+a[i],i+1))return 1;ss[i]=0;if(cur==0) return 0;while(a[i]==a[i+1] && i+1<n) i++;}else if(cur+a[i]==now){ss[i]=1;if(dfs(c+1,0,0)) return 1;ss[i]=0;return 0;}}return 0;}bool judge(int x,int y){if(x<y) return false;else return true;}int main(){int sum=0;int max=0;while(cin>>n){max=0;sum=0;sign=0;ssign=0;lsign=0;memset(a,0,sizeof(int)*65);memset(ss,0,65);if(n==0) break;int x;for(int i=0;i<n;i++){cin>>x;a[i]=x;sum+=x;if(x>max) max=x;}sort(a,a+n,judge);for(now=max;now<=sum;now++){memset(ss,0,65);if(sum%now!=0) continue;if(dfs(0,0,0)){sign=now;break;}}cout<<sign<<endl;}return 0;}


0 0