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?
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.
2 10 10 15 10 5 10 5 3 10 5 10 5 3 5 6 2 7 3
511
错误之处,对该题理解不够深,第一遍想用01dp水过,然后样例过不去,就开始排序,用贪心。 没有想到dp也可以加以排序。 思路:这道题和01背包最大的区别就是,多了一个qi加以限制。而这个限制十分好解决。可以通过 qi-pi算出一个差值p,按照由小到大排序就可以了。 假设A,p1,q1,v1;B:p2,q2,v2 若先买A,至少需要p1+q2 (p1 == q1情况下)若现买B,至少需要p2+q1; 若A<B,应先买A,即 q1-p1 > q2-p2;即差值大的先买,所以先买的应排到后面
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[5010]; struct pp { int p,q,v,ca; } s[510]; bool cmp(pp a,pp b) { return a.ca < b.ca; } int main() { int n,m,i,j; while(~scanf("%d%d",&n,&m)) { for(i = 0;i<n;i++) { scanf("%d%d%d",&s[i].p,&s[i].q,&s[i].v); s[i].ca = s[i].q-s[i].p; } sort(s,s+n,cmp); memset(dp,0,sizeof(dp)); 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; }