您的位置:首页 > 其它

HDU 1171 Big Event in HDU(0-1背包)

2017-01-24 15:00 387 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1171

题意:给出一系列的价值,需要平分,并且尽量接近。

思路:0—1背包问题。

0-1背包问题也就是有n种物品且每种只有一个。第i个物品的体积为vi,重量为wi。选择一些物品装到背包中,使得体积不超过背包的前提下重量尽可能大。

用f(i,j)表示“把前i个物品装到容量为j的背包中的最大总重量,其状态转移方程就是:

f(i,j)=max{ f(i-1,j),f(i-1,j-v[i])+w[i] }

所以在第i个物品的时候,我们需要判断是装还是不装,f(i-1,j)是不装,f(i-1,j-v[i])+w[i] 代表把第i件装入背包后得总价值,比较两者的大小,选择价值大的存入现在的背包。

f(i-1,j-v[i])是指当把前i件物品装入一个容量为j-v[i]大小的背包中的最大总重量。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int v[5010];
int dp[300000];

int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int n,a,b;
while (cin >> n && n > 0)
{
memset(v, 0, sizeof(v));
memset(dp, 0, sizeof(dp));
int k = 0;
int sum = 0;
for (int i = 0; i < n; i++)
{
cin >> a >> b;
while (b--)
{
v[k++] = a;
sum += a;
}
}
for (int i = 0; i < k; i++)
{
for (int j = sum / 2; j >= v[i]; j--)
dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
}
cout << sum - dp[sum / 2] << " " << dp[sum / 2] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: