代码来源:DeathYmz
AC的C++语言程序如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
//dfs 判断是否ok
int a[100],n,vis[100],L,last;
//dfs+剪枝
//1-对拼接到一半发现不能拼接-保留-寻找
//2-
bool dfs(int m,int l)//还剩下棍子和当前拼接剩余长度
{
if(m==0&&l==0) return true;
if(l==0) l=L;
int s=0;
if(l!=L)
s=last+1;//确保从未拼接的部分开始
for(int i=s;i<n;i++)
{
if(!vis[i-1]&&i>0&&a[i]==a[i-1]) continue;//长度相同跳过
if(!vis[i]&&a[i]<=l){
vis[i]=1;
last=i;//1
if(dfs(m-1,l-a[i])) return true;
else{
vis[i]=0;
if(l==L||a[i]==l) return false;//调整该次拼接的拼法
}
}
}
return false;
}
bool cmp(int a,int b){ return a>b; }
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(a,0,sizeof(a));
int sum=0,l_max=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]>l_max)
l_max=a[i];
}
sort(a,a+n,cmp);//从大到小排序
int i;
for(i=l_max;i<=sum/2;i++)
{
last=0;
memset(vis,0,sizeof(vis));
L=i;
if(sum%i==0)
if(dfs(n,i))
{
printf("%d\n",i);
break;
}
}
if(i>sum/2)
printf("%d\n",sum);
}
return 0;
}