poj 1011

来源:互联网 发布:java打印word文档 编辑:程序博客网 时间:2024/06/05 03:04

参考原po : http://blog.csdn.net/lyy289065406/article/details/6647960

#include<iostream>  #include<map>#include<string>   #include<algorithm>  #include<fstream>#include<cmath>  #include<vector>#include<queue>#include<map>#include<math.h>using namespace std;  #define lch(i) ((i)<<1)  #define rch(i) ((i)<<1|1)  #define sqr(i) ((i)*(i))  #define pii pair<int,int>  #define mp make_pair  #define FOR(i,b,e) for(int i=b;i<=e;i++)  #define FORE(i,b,e) for(int i=b;i>=e;i--)  #define ms(a)   memset(a,0,sizeof(a))  const int maxnum =21252;const  int  mod = 10007;int n,m;int ssum,st;int vec[64];bool visit[64];bool dfs(int di,int sum,int lastp,int num){if(num==n)return true;int unfit=0;FORE(i,lastp-1,0){if(visit[i]||vec[i]==unfit)continue;visit[i]=1;if(vec[i]+sum<di){if(dfs(di,sum+vec[i],i,num+1)){return true;}}else if(vec[i]+sum==di){unfit=0;if(dfs(di,0,n,num+1))//vec[i]灵活度最低,留给其他棍子灵活度最高也失败,剩下方案也失败return true;/*else{visit[i]=0;return false;}*/}unfit = vec[i];visit[i]=0;if(sum==0)break;}return false;}int cmp(const void* a,const void* b){return *(int*)a-*(int*)b;}//int main()    {  #ifdef _DEBUG_fstream fin("G:/1.txt");#else#define fin cin#endiffor(;;){fin>>n;if(!n)break;ssum=st=0;ms(vec);ms(visit);FOR(i,0,n-1){fin>>vec[i];ssum+=vec[i];}qsort(vec,n,sizeof(int),cmp);int flag=0;for(int i=vec[n-1];i<=ssum-i;i++){if(ssum%i==0){if(i>=st&&dfs(i,0,n,0)){printf("%d\n",i);flag=1;break;}}}if(!flag)printf("%d\n",ssum);}return 0;}  

0 0