import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] gun = new int[61];
int max = 0;//最长的小木棍长度
int sum = 0;//木棍总长度
for (int i = 1; i <= n; i++) {
int len = sc.nextInt();
max = Math.max(len, max);
gun[len]++;
sum += len;
}
int ans = sum;
for (int len = max; len < sum/2; len++) {
if (sum % len == 0) {
if (dfs(gun, sum, len, sum/len, 0, 0, max, max) == true) {
ans = len;
break;
}
}
}
System.out.println(ans);
}
/***
*
* @param g 存放各个长度木棍的数量
* @param sum 完整木棍的长度
* @param len 本次尝试的木棍长度
* @param num 本次每根小木棍的长度
* @param k 本次进行到第几次完整木棍的拼装
* @param single 完整木棍目前的拼装长度
* @param last 上一次拼装使用的最大小木棍
* @param max 小木棍的最大长度限制
* @return
*/
private static boolean dfs(int[] g, int sum, int len, int num, int k, int single, int last, int max) {
if (single == len) {
single = 0;
last = max;
k++;
if (k == num) return true;
}
for (int i = last; i >= 1; i--) {
if (g[i] >= 1 && single + i <= len) {
g[i]--;
if(dfs(g, sum, len, num, k, single + i, i, max)) return true;
g[i]++;
if (single == 0 || single + i == len) {//当数组元素不够时
break;
}
}
}
return false;
}
}
乔治的小木棍
最新推荐文章于 2024-08-29 19:39:30 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)