题目的大意是给了你有限个棍子以及每个棍子的长度,而且所有的棍子都是由有限个长度相同的棍子截断得到的,让你求被截棍子的最小长度
搜索剪枝神题,做的我够呛
提供一个比较好的解题报告 http://www.cnblogs.com/mycapple/archive/2012/08/14/2638430.html
比较奇怪的是数组开小了WA了,开大就过了
代码还是比较挫的
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std; int shu[];
int hash[];
int feng,n,ok,chu,fail;
int nhash[]; void dfs(int all,int add)
{
int i;
if(add==chu){
ok=;return ;
}
if(ok==||fail==){
return ;
}
if(all>&&hash[]==){ //第一根木棍没有被利用,就结束整个搜索
fail=;return;
} for(i=;i<=n;i++){
if(hash[i]==)continue; if(all==(add*feng)){
if(hash[i-]==){//当前的第一根木棍 组成一定要成功
return;
}
}
if((all+shu[i])<=((add+)*feng)){
if(shu[i-]==shu[i]&&hash[i-]==)continue;
hash[i]=;
if((all+shu[i])==((add+)*feng))
dfs(all+shu[i],add+);
else
dfs(all+shu[i],add);
hash[i]=;
}
}
} int cmp(int a,int b){
return a>b;
} int main()
{
int all,i,j;
while(scanf("%d",&n)!=EOF){
if(n==)return ;
int max=,temp;
all=; for(i=;i<=n;i++){
scanf("%d",&shu[i]);
all+=shu[i];
if(shu[i]>max)max=shu[i];
}
sort(&shu[],&shu[n+],cmp); for(i=max;i<=all;i++){
if(all%i!=)continue;
for(j=;j<=n;j++)hash[i]=;
hash[]=;
feng=i;
chu=all/i;
fail=;
ok=;
dfs(,);
if(ok==)break;
} printf("%d\n",feng);
} return ;
}