HDU3466-Proud Merchants(01背包变形)
2015-11-02 16:45
253 查看
需要排序的01背包。
这种题排序时只需要考虑两个怎么排,重载小于号就可以了。
需要注意的是,如果一个物品你想先放进背包里,那么你排序是要放到后面!01背包的放置顺序的倒着的!
看到别人的博客都只是比较了q-p,表示不解,但是都能AC。。。是谁错了呢?或者我这种表达式可以化成那个样子?
AC代码:
这种题排序时只需要考虑两个怎么排,重载小于号就可以了。
需要注意的是,如果一个物品你想先放进背包里,那么你排序是要放到后面!01背包的放置顺序的倒着的!
看到别人的博客都只是比较了q-p,表示不解,但是都能AC。。。是谁错了呢?或者我这种表达式可以化成那个样子?
AC代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; // (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000), (1 ≤ Pi ≤ Qi ≤ 100, 1 ≤ Vi ≤ 1000), int p[505], q[505], v[505]; int dp[5005]; /** n个物品,有qi的钱才能买,需要花费pi,价值vi,求最大价值 直接01背包会出错,需要排序。 排序时考虑其中两个物品i,j 买i,j和买j,i分别需要max(q[i], p[i]+q[j]) max(q[j], p[j]+q[i]) */ struct node{ int p, q, v; bool operator < (const node a) const { //return q > a.q; int x = max(q, p + a.q); int y = max(a.q, a.p + q); return x > y; } } a[505]; int main() { int n, m; while (cin >> n >> m) { for (int i = 0; i < n; ++i) cin >> a[i].p >> a[i].q >> a[i].v; sort(a, a + n); memset(dp, 0, sizeof dp); for (int i = 0; i < n; ++i) { for (int j = m; j >= a[i].q; --j) { dp[j] = max(dp[j], dp[j - a[i].p] + a[i].v); } } cout << dp[m] << endl; } return 0; }
相关文章推荐
- Linux 下常用解压命令(转载)
- 可变参数
- eclipse color themes 让eclipse编码好看点
- 项目4.1 -- 广义表的原子统计
- T-SQL 学习之路之数据库完整性之域完整性(一)
- 第10周上机实践项目1 - 二叉树算法库
- json.dumps错误:'utf8' codec can't decode byte解决方案
- 第九周项目4—广义表算法库及应用(1)
- Linux(Centos)下条件查找执行
- Swift内置的数字类型及基本的转换方法
- 【hibernate】HQL的种种实例
- 第9周 项目3 稀疏矩阵的三元组表示的实现及应用(2)
- SPSS 授权秘钥
- 关于File
- VC中_T("")和L的区别
- UML-构件图和部署图
- 支持放大的top排行
- MapReduce调度器
- JavaScript学习日记3 条件判断
- XE下显示托盘图标(TrayIcon)