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;
}

  

 

posted @   我不吃饼干呀  阅读(304)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示