不坑爹,更坑爹.详见http://blog.csdn.net/bit_line/article/details/38374445
这里修改的部分是处理题目新增的坑爹数据:长度超过50的木棍!
我靠,顶你个肺!
还有出题人的腹黑, 测试数据存在所有木棍都超过50长的.然而我不解的是为什么这种情况下需要输出0(不加就错).我原来的考虑是不输出直接跳过,然后一直WA.
哎哎唉iaiaiaiaiaiiaiai
俺们toj奏是牛...
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 128;
int a[MAX], ans, sum, n, tot;
bool vis[MAX];
bool cmp(int a, int b) {
return a > b;
}
bool dfs(int p, int len, int cnt) {
if (cnt == tot) return true;
for (int i = p; i < n; ++i) {
if (vis[i] || a[i] + len > ans) continue;
if (a[i] + len == ans) {
vis[i] = true;
if (dfs(cnt+1, 0, cnt+1)) return true;
return vis[i] = false;
} else if (a[i] + len < ans) {
vis[i] = true;
if (dfs(i+1, len+a[i], cnt)) return true;
vis[i] = false;
if (!len) return false;
}
while (i < n-1 && a[i] == a[i+1]) ++i;
}
return false;
}
int main() {
while (~scanf(" %d", &n) && n) {
sum = 0, ans = 0;
for (int i = 0; i < n; ++i) {
scanf(" %d", a+i);
if (a[i] > 50) {
--i, --n;
continue;
}
sum += a[i];
if (a[i] > ans) ans = a[i];
}
if (!n) puts("0");
else {
sort(a, a+n, cmp);
for (; ans <= sum; ++ans) {
if (sum % ans) continue;
tot = sum / ans;
memset(vis, false, sizeof(vis));
if (dfs(0, 0, 0)) break;
}
printf("%d\n", ans);
}
}
return 0;
}