PKU 1011 Sticks
Sticks
http://poj.org/problem?id=1011
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 103691 | Accepted: 23627 |
Description
Input
Output
Sample Input
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
Sample Output
6 5
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=70; int n,len,num; int sticks[N],vis[N]; int flag; int cmp(int a,int b){ return a>b; } void DFS(int k,int cur,int cnt){ if(flag) return; if(cnt==num){ flag=1; return ; } if(cur==len) DFS(0,0,cnt+1); else{ int pre=-1; for(int i=k;i<n;i++) if(!vis[i] && sticks[i]+cur<=len && sticks[i]!=pre){ pre=sticks[i]; vis[i]=1; DFS(i+1,sticks[i]+cur,cnt); vis[i]=0; if(k==0 || flag) return ; } } } int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d",&n) && n){ int sum=0; flag=0; for(int i=0;i<n;i++){ scanf("%d",&sticks[i]); sum+=sticks[i]; } sort(sticks,sticks+n,cmp); for(len=sticks[0];len<=sum;len++) if(sum%len==0){ num=sum/len; memset(vis,0,sizeof(vis)); DFS(0,0,0); if(flag) break; } printf("%d\n",flag?len:sum); } return 0; }