题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171
问题描述:给出每个物体的价值和数量,如何分使得A,B所得价值最接近并且A的价值不能小于B
解决方法:dp[i]是体积为i时,获得的最大价值。易得: dp[j] = max(dp[j], dp[j - val[i]] + val[i]);
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int val[5000];
int dp[250000];
int main()
{
int n, i, j, cnt, k, a, b, sum;
while (cin >> n,n > 0)
{
cnt = 0;
sum = 0;
memset(dp, 0, sizeof(dp));
memset(val, 0, sizeof(val));
while (n--)
{
cin >> a >> b;
while (b--)
{
val[cnt++] = a;
sum += a;
}
}
for (int i = 0; i < cnt; i++)
for (int j = sum / 2; j >= val[i]; j--)
dp[j] = max(dp[j], dp[j - val[i]] + val[i]);
cout << sum - dp[sum / 2] << " " << dp[sum / 2] << endl;
}
return 0;
}