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;}
相关文章推荐
- 修改Android签名证书keystore的密码、别名alias以及别名密码
- Redis:redission 源代码剖析1 连接建立
- Android蓝牙打印二维码打印外卖单打印
- http 监测器
- JSP下拉选框,级联选择
- C/C++中const关键字详解
- 期末总结
- 基于Cloudera Manager 5和CDH5(版本5.3.3)的Hadoop集群安装
- 为什么说每个程序员都应该刷几道LeetCode?
- (九)串行口方式0 拓展并行输入端口 74LS165 芯片
- [leetcode] 258. Add Digits 解题报告
- 源码探索系列11---关于View的绘制
- Linux man 命令后面的数字含义及作用
- jq查找父类元素三个函数的区别
- 金斯顿SD卡辨别
- LA 3602 (贪心,模拟)
- 加载xib的方法总结
- 各类总线传输速率
- 编程心得
- React开发项目例子