hdu3466 Proud Merchants(01背包)

时间:2025-03-24 20:05:01

https://vjudge.net/problem/HDU-3466

一开始想到了是个排序后的背包,但是排序的策略一直没对。

两个物品1和2,当p1+q2>p2+q1 => q1-p1<q2-p2时选1.

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define INF 1e9
typedef long long ll;
using namespace std;
typedef struct{
int p, q, v;
int x;
}Node;
Node node[];
int m, n, dp[];
bool cmp(const Node a, const Node b)
{
return a.x<b.x;
}
int main()
{
IO;
while(cin >> n >> m){
memset(dp, , sizeof(dp));
for(int i = ; i < n; i++){
cin >> node[i].p >> node[i].q >> node[i].v;
node[i].x = node[i].q-node[i].p;//p1+q2>p2+q1 => q1-p1<q2-p2
}
sort(node, node+n, cmp);
for(int i = ; i < n; i++){
for(int j = m; j >= node[i].p; j--){
if(j >= node[i].q)
dp[j] = max(dp[j], dp[j-node[i].p]+node[i].v);
}
}
cout << dp[m] << endl;
}
return ;
}