01背包问题。将数组划分为两部分,要求两部分的和的之差绝对值最小。

#include <bits/stdc++.h>
using namespace std;
int dp[210000];
int n,arr[51];
int main()
{
    int n;
    scanf("%d",&n);
    int sum = 0;
    for(int i = 0 ; i < n ; i ++){
        scanf("%d",&arr[i]);
        arr[i] /= 1024;
        sum += arr[i];
    }
    for(int i = 0 ; i < n ; i ++)
        for(int j = sum/2 ; j >= arr[i] ; --j)
            dp[j] = max(dp[j],dp[j-arr[i]]+arr[i]);
    printf("%d\n",(sum-dp[sum/2])*1024);
    return 0;
}
/*
5
3072 3072 7168 3072 1024
*/