HDU 3466 Proud Merchants (01背包)
2016-05-05 19:31
302 查看
题意:输入n,m,表示有n个物品,m单位的钱,接下来输入n行 p, q, v 分别表示 花费, 手中需要有的费用, 价值。求最多能够取得的价值。
分析:如果没有q的话就是简单的01背包,加入q这个限制条件后,需要对物品的q-p进行升序排序。
原因:
for (i=1; i<=n; i++)
for (j=m; j>=q[i]; j--)
dp[j]=max(dp[j], dp[j-p[i]]+v[i]);
分析:如果没有q的话就是简单的01背包,加入q这个限制条件后,需要对物品的q-p进行升序排序。
原因:
for (i=1; i<=n; i++)
for (j=m; j>=q[i]; j--)
dp[j]=max(dp[j], dp[j-p[i]]+v[i]);
算i时,最小能算到q[i]-p[i],需要先把最小的求出来。因此以q[i]-p[i]从小到大排序
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int maxn = 505; struct A { int p, q, v; }a[maxn]; int dp[maxn*10]; bool cmp(A x1, A x2) { return x1.q-x1.p<x2.q-x2.p; } int main() { int n, m; while(~scanf("%d%d", &n, &m)) { for(int i=1; i<=n; i++) { scanf("%d %d %d", &a[i].p, &a[i].q, &a[i].v); } sort(a+1, a+n+1, cmp); memset(dp, 0, sizeof(dp)); for(int i=1; i<=n; i++) { for(int j=m; j>=a[i].q; j--) { dp[j] = max(dp[j-a[i].p]+a[i].v, dp[j]); } } printf("%d\n", dp[m]); } return 0; }
相关文章推荐
- 4. Median of Two Sorted Arrays
- MMDrawerController,最简代码实现抽屉效果
- 标准C++中的string类的用法总结
- http报文格式和post, get方式区别与误区(很不错哦)
- 匈牙利算法解决指派问题清晰流程
- android设计模式——建造者模式
- 将空格用%20替换
- 优先队列+括号配对 51Nod1476 括号序列的最小代价
- 线程间通信:生产者消费者(等待唤醒机制)
- 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (六)之自动寻路及优化
- 浅谈锚链接(native 嵌套 h5)
- 程序员必读书单
- 实验一:认识树莓派
- JVM工作原理
- Win10太高端,如何连接XP / Win7 共享出来的打印机?
- CSS 颜色代码 qt
- swift实现ios类似微信输入框跟随键盘弹出的效果
- Exercise(12):纸牌均分
- VC Excel类操作类
- B. Gerald is into Art