题意比较简单;重点在剪枝上。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int n,num[70],mark[70],k,flash; int dfs(int s,int ii,int t,int c) { if(t==c) { flash=1; return 1; } if(flash) return 0; if(s==k) { dfs(0,1,t+1,c); //return 1; } else { int i; for(i=ii;i<=n;i++) { if(s+num[i]>k) continue; if(mark[i]) continue; mark[i]=1; dfs(s+num[i],i+1,t,c); mark[i]=0; if(s==0) return 0;//如果当前是第一个木棍但是没有用上 很明显不能存在答案 在时间上是个大优化 while(num[i+1]==num[i]) i++;//当前这个数没用上则与他相等的也用不上 if(flash) return 0; } } return 0; } int cmp(int a,int b) { return a>b; } int main() { int i,j; while(~scanf("%d",&n),n) { int Max=0,sum=0; for(i=1;i<=n;i++) { scanf("%d",&num[i]); sum+=num[i]; if(Max<num[i]) Max=num[i]; } //printf("%d\n",sum); sort(num+1,num+1+n,cmp); flash=0; for(i=n;i>=1;i--) { if(sum%i!=0) continue; k=sum/i; //printf("%d \n",i); if(k<Max) continue; memset(mark,0,sizeof(mark)); dfs(0,1,0,i); if(flash) break; } printf("%d\n",k); } return 0; }
时间: 2024-10-10 06:57:28