您的位置:首页 > 其它

POJ1011 一种dfs实现

2015-12-27 15:04 232 查看
//已经删掉了剪枝,如果要AC还要继续剪枝,思路大家可以自己思考一下
//本题主要使用的思想是DFS的第三种类型,还原现场,DFS三种类型详情可参阅本人博客POJ1015那篇
#include<iostream>#include<cstring>#include<stdlib.h>using namespace std;int n;int maxx;int minx;int d[65];bool v[65];int cmp(const void *a,const void *b){return *(int*)b-*(int*)a;}bool dfs(int sum,int start,int already){if(already==sum){bool flag=true;int s;for(int i=1;i<=n;i++){if(v[i]!=true){flag=false;s=i;break;}}if(flag==true){return true;}else{v[s]=true;if(dfs(sum,s,d[s])){return true;}else{v[s]=false;return false;}}}for(int i=start+1;i<=n;i++){if(v[i]==false&&already+d[i]<=sum){v[i]=true;if(dfs(sum,i,already+d[i])==true){return true;}v[i]=false;}}return false;}int main(){cin>>n;d[0]=100000;int sumOfAll;while(n!=0){minx=100;maxx=-100;sumOfAll=0;for(int i=1;i<=n;i++){cin>>d[i];sumOfAll+=d[i];if(d[i]>maxx){maxx=d[i];}if(d[i]<minx){minx=d[i];}v[i]=false;}qsort(d,n+1,sizeof(int),cmp);v[1]=true;for(int i=maxx;i<=50;i+=minx){if(sumOfAll%i==0)if(dfs(i,1,d[1])==true){cout<<i<<endl;break;}}cin>>n;}return 0;} 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: