OpenJudge13 Sticks

来源:互联网 发布:win10 休眠不关闭网络 编辑:程序博客网 时间:2024/06/08 16:35

题目: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;}
0 0
原创粉丝点击