hdu 1455 ——sticks

来源:互联网 发布:黄金计划软件 编辑:程序博客网 时间:2024/05/08 08:02

深搜——剪枝

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;bool cmp(int a,int b){return a>b;}int num[1000],vis[1000];int n,Sum;int s,K;int flag;//木棍序号 已完成边数 当前木棍长度   void dfs(int x,int k,int sum){      int i;      int last=-1;    if(flag)    return;    if(k==K-1)    {    flag=1;        return ;     }      for(i=x;i<n;i++)      {          if(!vis[i]&&sum+num[i]<=s&&last!=num[i])    {     last=num[i];vis[i]=1;        if(sum+num[i]==s) dfs(0,k+1,0);        else         {  dfs(i+1,k,sum+num[i]);      vis[i]=0;   if(flag||x==0)//x==0 缺了这个就超时                  return;       }    }   }  int main(){int i;while(cin>>n&&n){Sum=0;memset(vis,0,sizeof(vis));for(i=0;i<n;i++){ cin>>num[i]; Sum+=num[i];}sort(num,num+n,cmp);for(i=num[0];i<=Sum;i++){if(Sum%i==0){ memset(vis,0,sizeof(vis));  s=i;K=Sum/i;flag=0;dfs(0,0,0);if(flag){printf("%d\n",i);break;}}}}return 0;}


原创粉丝点击