全部评论
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
*/
相关推荐
点赞 评论 收藏
分享