9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0Sample Output
6 5
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define maxn 70
#define INF 0x3f3f3f3f
using namespace std;
bool vis[maxn];
int n;
int a[maxn];
int len;
bool cmp(int x,int y)
{
return x>y;
}
bool dfs(int ans,int x)
{
if(ans==0)
{
return 1; //所有的都被分配
}
if(x==0) x=len;
for(int i=0; i<n; i++)
{
if(vis[i]||a[i]>x) continue; //a[i]被用或者a[i]长度大于所需长度
vis[i]=1;
if(dfs(ans-1,x-a[i])) return true; //存放成功返回上一层
vis[i]=0;
if(x==len||x==a[i]) return false; //长度足够但不能被存满而返回到原是长度或a[i]
while(a[i]==a[i+1])i++; //重复元素不搜索
}
return false;
}
int main()
{
while(scanf("%d",&n)&&n)
{
int sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n,cmp);
int i;
for(i=a[0]; i<=sum/2; i++)
{
if(sum%i) continue;
memset(vis,0,sizeof(vis));
len=i;
if(dfs(n,i))
{
printf("%d\n",i);
break;
}
}
if(i>sum/2) printf("%d\n",sum);
}
return 0;
}
怪不得网上代码都差不多,自能说要剪枝的地方太多,少了那个又不行,错了N次,照个学长的代码看着改都不行,我会常来看你的