HDU3466-Proud Merchants(01背包变形)
需要排序的01背包。
这种题排序时只需要考虑两个怎么排,重载小于号就可以了。
需要注意的是,如果一个物品你想先放进背包里,那么你排序是要放到后面!01背包的放置顺序的倒着的!
看到别人的博客都只是比较了q-p,表示不解,但是都能AC。。。是谁错了呢?或者我这种表达式可以化成那个样子?
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #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; } |
分类:
ACM/算法/数据结构
标签:
01背包
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架