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]大小的背包中的最大总重量。
题意:给出一系列的价值,需要平分,并且尽量接近。
思路: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; }
相关文章推荐
- java读取pdf和MS Office文档
- 像微信一样录制视频和音频
- redis做成service来start和stop
- Unity3d在ios上发布
- POJ 3295 Tautology
- Android苦手的App之旅(3)
- iOS中的几个id(UDID、UUID、IDFA、IDFV)
- LeetCode 19 Remove Nth Node From End of List
- Android小米推送简单使用方法
- Nginx的反向代理和负载均衡
- 未来,这8类人将被彻底淘汰
- 前端工程化之动态数据代理
- return,break和continue
- SpringMVC学习系列 1-12
- hbase大规模数据写入的优化历程
- Struts2学习笔记(四)——Struts标签相关
- linux工匠的博客
- iOS 图片压缩方法的示例代码
- 剑指Offer-面试题39-二叉树的深度
- 关于postman使用的几点心得