sticks
来源:互联网 发布:网易暴雪 腾讯 知乎 编辑:程序博客网 时间:2024/05/18 04:24
#include <iostream>#include <algorithm>using namespace std;int a[100],n,ss,ll,mark[100],flag,ww[2000];void dfs(int c,int sum1,int k){ int i; if(!ww[ll-sum1])return; if(flag||c==ss-1){flag=1;return;}if(sum1==ll){for(i=n;i>=1;i--)if(!mark[i])break;mark[i]=1;dfs(c+1,a[i],i-1);mark[i]=0;}else{for(i=k;i>=1;i--){if(i<n&&mark[i+1]==0&&a[i+1]==a[i])continue;if(!mark[i]&&a[i]+sum1<=ll){mark[i]=1;dfs(c,sum1+a[i],i-1);mark[i]=0;if(a[i]+sum1==ll)break;}}}return;}int main (){ int i,sum,j; while(scanf("%d",&n)!=EOF) { if(n==0) break;memset(ww,0,sizeof(ww)); sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a+1,a+1+n);if(a[1]>50)continue; while(a[n]>50) {sum-=a[n];n--;}ww[0]=1;for(i=1;i<=n;i++){for(j=sum-a[i];j>=0;j--)if(ww[j])ww[j+a[i]]=1;} for(i=a[n];i<=sum;i++) { if(sum%i||!ww[i]) continue; memset(mark,0,sizeof(mark)); ss=sum/i; ll=i;flag=0;dfs(0,0,n); if(flag) {printf("%d/n",i);break;}if(2*i>=sum){printf("%d/n",sum);break;} } }return 0;}