/**
* 一个 正整数数组,将它分成两个数组,长度均无限制,使得这两个数组的和最接近。
*
* 动态规划
*
*
*/
public class ArrayDivide1 {
public static int divide(int[] a){
int sum = 0;
for(int i=0; i<a.length; i++){
sum += a[i];
}
//本来定义二维数组,b[i][j]表示前i个数中随意选取若干个,使得其和等于j,是否存在。
//但是参考01背包,i只依赖与i-1,可用一维数组代替,但是要从后向前扫描
//每一次外围循环,都要从头刷新这个一维数组,继承上轮循环的值,并且设置新的true
boolean[] b = new boolean[sum/2+1];
b[0] = true;
for(int i=1; i<=a.length; i++){
for(int j=sum/2; j>0; j--){
if(!b[j] && j>=a[i]){
b[j] = b[j-a[i]];
}
}
}
for(int i=sum/2; i>0; i--){
if(b[i]){
return i;
}
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a = {4, 1, 6, 2, 3, 5};
int x = ArrayDivide1.divide(a);
System.out.println(x);
}
}拆分正整数组,使二者和最接近,且长度无限制
最新推荐文章于 2025-10-21 15:44:16 发布
本文介绍了一个使用动态规划解决的问题:如何将一个正整数数组分割成两个子集,使这两个子集的元素之和尽可能接近。通过定义一个一维数组来追踪可能达到的和,最终找到最接近总和一半的最大值。
2695

被折叠的 条评论
为什么被折叠?



