小木棍
内存限制: 1024 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入格式
第一行为一个单独的整数 N 表示砍过以后的小木棍的总数。第二行为 N 个用空格隔开的正整数,表示 N 根小木棍的长度。
输出格式
输出仅一行,表示要求的原始木棍的最小可能长度。
样例
样例输入
复制9
5 2 1 5 2 1 5 2 1
样例输出
复制6
数据范围与提示
1 <= N <= 60
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
int n, v, len, sum, ans;
int a[N];
bool b[N];
bool DFS(int x, int y, int last) {
if(x > sum) {
return true;
}
if(y == len) {
return DFS(x + 1, 0, 1);
}
int m = 0;
for(int i = last; i <= n; i++) {
if(m != a[i] && y + a[i] <= len && !b[i]) {
b[i] = 1;
if(DFS(x, y + a[i], i + 1)) {
return true;
}
m = a[i], b[i] = 0;
if(!y || y + a[i] == len) {
return false;
}
}
}
return false;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
ans += a[i];
v = max(v, a[i]);
}
sort(a + 1, a + n + 1);
reverse(a + 1, a + n + 1);
for(len = v; len <= ans; len++) {
if(ans % len) {
continue;
}
sum = ans / len;
memset(b, 0, sizeof(b));
if(DFS(1, 0, 1)) {
break;
}
}
printf("%d\n", len);
return 0;
}
标签:return,int,题解,sum,样例,C++,木棍,长度
From: https://blog.csdn.net/xxy20110830/article/details/137384268