您的位置:首页 > 运维架构

OpenJudge13 Sticks

2015-11-02 16:21 323 查看
题目:http://noi.openjudge.cn/ch0407/13/

分析:搜索+强剪枝.

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=70;
int n,a[Tmax],ss;
bool v[Tmax],ok;
bool cmp(int l,int r)
{
return l>r;
}
bool dfs(int x,int num,int aim,int now)
{
if(num==n&&aim==now) return true;
int i;
if(now==0)
{
for(i=1;i<=n;i++)
if(!v[i]){
v[i]=true;
if(dfs(i,num+1,aim,a[i])) return true;
else {
v[i]=false;
return false;
}
v[i]=false;
}
return false;
}
if(aim==now) if(dfs(0,num,aim,0)) return true;
else return false;
for(i=x+1;i<=n;i++)
if(a[i]<=aim-now&&!v[i]&&((a[i-1]==a[i]&&v[i-1]==true)||(a[i-1]!=a[i]))){
v[i]=true;
if(dfs(i,num+1,aim,now+a[i])) return true;
v[i]=false;
}
return false;
}
int main()
{
int i;
while(scanf("%d",&n)==1&&n!=0)
{
ss=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ss+=a[i];
}
sort(a+1,a+1+n,cmp);
for(i=a[1];i<=ss;i++)
{
if(ss%i!=0) continue;
memset(v,0,sizeof(v));
if(dfs(0,0,i,0)){
printf("%d\n",i);
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: