F

来源:互联网 发布:金融数据公司 编辑:程序博客网 时间:2024/05/17 06:16

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?

Input
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
11

题意:你先在手上有m多的钱,给你n个物品(买这个物品所需要的花费,买这个物品至少需要准备的钱数,买这个物品所能得到的价值);

分析,不难发现这是一道0-1背包的DP问题,然而问题就出在,我们拿每一个物品的时候需要一个限制条件,我们当前手上的钱数是否可以购买这个物品。我们可以想一下,我们应该优先选取限制条件最高的物品,可证。

#include<iostream>#include<cstring>#include<algorithm>#include<iomanip>#include<cstdio>using namespace std;struct node {    int p, q, v;}a[510];int dp[5010];int cmp(node a, node b){    return a.q - a.p < b.q - b.p;}int main(){    int n, m;    int dp[5005];    while (~scanf("%d%d", &n, &m))    {        memset(dp, 0, sizeof dp);        for (int i = 0; i < n; i++)        {            scanf("%d%d%d", &a[i].p, &a[i].q, &a[i].v);        }        sort(a, a + n, cmp);        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);            }        }        printf("%d\n", dp[m]);    }    return 0;}
原创粉丝点击