标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 129606 | Accepted: 30388 |
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
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[70], n; bool vis[70]; int Cmp(int a, int b) { return a>b; } //len 是要构造的每段的长度。 cur是构造每段 //长度的过程中还需要的。 num是剩余的木棒数。 int dfs(int len, int cur, int num) { if(cur==0&&num==0) return true; if(cur==0) cur = len; for(int i=0; i<n; i++) { if(vis[i]) continue; if(cur-a[i]>=0) { vis[i] = 1; if(dfs(len, cur-a[i], num-1)) return true; vis[i] = 0; if(a[i]==cur||cur==len) return false;//a[i]==cur //满足一个木棒长度, 但是不满足全部的 cur==len是进行循环之后还是不满足 while(a[i]==a[i+1]&&i+1<n) ++i; } } return false; } int main() { while(scanf("%d", &n), n) { int sum = 0; for(int i=0; i<n; i++) { scanf("%d", &a[i]); sum+=a[i]; } sort(a, a+n, Cmp); for(int i=a[0]; i<=sum; i++) { if(sum%i==0) { memset(vis, 0, sizeof(vis)); if(dfs(i, 0, n)) { printf("%d\n", i); break; } } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/acm1314/p/4767755.html