将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
收起
输入
第1行:一个数N,N为正整数的数量。 第2 - N+1行,N个正整数。 (N <= 100, 所有正整数的和 <= 10000)
输出
输出这个最小差
输入样例
5 1 2 3 4 5
输出样例
1
分两组,求之间和的最小值。问题可以转化为两组之和尽量小,尽可能向总和的一半靠,这就变成了背包问题。
背包总量是sum/2,求背包最大价值。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin =new Scanner(System.in);
int n;
n=cin.nextInt();
int a[]=new int[n+10];
int dp[]=new int[10002];
int sum=0;
for(int i=0;i<n;i++)
{
a[i]=cin.nextInt();
sum+=a[i];
}
int minn=999999;
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=a[i];j--)
{
dp[j]=Math.max(dp[j], dp[j-a[i]]+a[i]);
}
}
System.out.println(sum-2*dp[sum/2]);
}
}