自己第一次在linux下用vim 编写的代码,并且A题的,很高兴;
就是poj上面的一个搜索题;题目很是经典,搜索剪枝优化;
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int num[65];
bool vis[65];
int Max;
int sum;
bool ok;
int n;
int len;
void dfs(int left,int con,int k,int cnt){
if(cnt==con){
if(left==len) ok=true;return;
}
int pre=-1;
for(int i=k;!ok&&i<n;++i){
if(!vis[i]&&pre!=num[i]&&left>=num[i])
{
pre=num[i];
vis[i]=true;
if(left==num[i])
dfs(len,con,0,cnt+1);
else
dfs(left-num[i],con,i+1,cnt);
vis[i]=false;
if(k==0)return;
}
}
}
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
while(~scanf("%d",&n)&&n){
Max=-999;
ok=false;
sum=0;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
sum+=num[i];
vis[i]=false;
// if(num[i]>Max)
// Max=num[i];
}
sort(num,num+n,cmp);
for(int i=num[0];i<sum;i++){
if(sum%i==0)
{
memset(vis,false,sizeof(vis));
int con=sum/i;
len=i;
dfs(i,con,0,0);
if(ok){
printf("%d\n",len);
//printf("%d\n",len);
break;
}
}
}
if(!ok)
printf("%d\n",sum);
}
return 0;
}