给定一个数组,分成两个数组使得两个组的和的差的绝对值最小,并且输出两部分个数差值最小
#include <iostream>
#include <cstdio>
#include <cstring> //for memset
#include <algorithm> //for max
#include <vector>
using namespace std;
int main()
{
int n=4;
int sum = 0;
vector<int>V = { 1,3,4,6};
for (int i = 0; i < n; ++i) {
sum += V[i];
}
vector<int>dp(sum + 1, 0);//所有值加起来的和
vector<int>res(sum + 1, 0);
for (int i = 0; i < n; ++i)
{
for (int j = sum/2; j >= V[i]; j--)
{
dp[j] = max(dp[j - V[i]]+ V[i], dp[j]);
if (dp[j - V[i]] + V[i]>= dp[j])
res[j] = res[j - V[i]] + 1;
}
}
cout<<(sum - dp[sum / 2] * 2);//两组数据的差值
cout << endl;
cout << n - res[sum / 2]; //两组数据个数的差值
return 0;
}