Problem Description
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerful kingdom in the world. As a result, the people in this country are still very proud even if their nation hasn’t been so wealthy any more.
The merchants were the most typical, each of them only sold exactly one item, the price was Pi, but they would refuse to make a trade with you if your money were less than Qi, and iSea evaluated every item a value Vi.
There are several test cases in the input.
Each test case begin with two integers N, M (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000), indicating the items’ number and the initial money.
Then N lines follow, each line contains three numbers Pi, Qi and Vi (1 ≤ Pi ≤ Qi ≤ 100, 1 ≤ Vi ≤ 1000), their meaning is in the description.
The input terminates by end of file marker.
Output
For each test case, output one integer, indicating maximum value iSea could get.
Sample Input
2 10
10 15 10
5 10 5
3 10
5 10 5
3 5 6
2 7 3
Sample Output
5
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerful kingdom in the world. As a result, the people in this country are still very proud even if their nation hasn’t been so wealthy any more.
The merchants were the most typical, each of them only sold exactly one item, the price was Pi, but they would refuse to make a trade with you if your money were less than Qi, and iSea evaluated every item a value Vi.
If he had M units of money, what’s the maximum value iSea could get?
InputThere are several test cases in the input.
Each test case begin with two integers N, M (1 ≤ N ≤ 500, 1 ≤ M ≤ 5000), indicating the items’ number and the initial money.
Then N lines follow, each line contains three numbers Pi, Qi and Vi (1 ≤ Pi ≤ Qi ≤ 100, 1 ≤ Vi ≤ 1000), their meaning is in the description.
The input terminates by end of file marker.
Output
For each test case, output one integer, indicating maximum value iSea could get.
Sample Input
2 10
10 15 10
5 10 5
3 10
5 10 5
3 5 6
2 7 3
Sample Output
5
11
题意是: 给你钱m,买东西,共有 n 件物品,
每件物品有 价格P、价值V和特别属性Q,
Q指你如果想买这件物品 你的手中至少有这钱Q 。
问给你钱M ,列出N件物品,最多能获得多少价值的东西。
这个Q使得题目与普通的01背包有了区别。
于是,对任意两个物品i,j,我们可以算出两种顺序所需要的最少金额,
若i->j,则至少需要Pi+Qj ; 若是j->i则至少需要Pj+Qi。
如果已知结果是i->j较优的话,则有Pi+Qj<Pj+Qi,即Qi-Pi>Qj-Pj。
所以若对之前的物品先按照Q-P由大到小排好序后,再进行01背包即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#define LL long long
using namespace std;
int dp[5005];
struct node{
int p,q,v;
}s[505];
bool cmp(node a,node b)
{
return (a.q-a.p)<(b.q-b.p);
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m)){
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++){
scanf("%d%d%d",&s[i].p,&s[i].q,&s[i].v);
}
sort(s,s+n,cmp);
for(i=0;i<n;i++){
for(j=m;j>=s[i].q;j--){
dp[j]=max(dp[j],dp[j-s[i].p]+s[i].v);
}
}
printf("%d\n",dp[m]);
}
return 0;
}