HDU--3466--Proud Merchants--01揹包

Proud Merchants

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 2777    Accepted Submission(s): 1155


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.
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
 
題意:給你N個物品和M單位的金錢,每個物品有價格a、購買的前提資金b、價值c,要買某個物品,你的錢必須大於等於b,求出最大能獲得的價值量

這是個有前提的揹包問題,主要是判斷物品出場的順序,本人表示跟上一題一樣,準備作死的節奏,就不解析了,等弄明白了再加上



#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Max(a,b) a>b?a:b
using namespace std;
struct node
{
    int a,b,c;
}s[555];
bool cmp(const node &a,const node &b)
{
    return a.b-a.a<b.b-b.a;	//排序規則
}
int main (void)
{
    int n,m,i,j,k,l;
    int dp[5555];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].c);
        }
        sort(s,s+n,cmp);
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)	//01揹包
        for(j=m;j>=s[i].b;j--)
        dp[j]=Max(dp[j],dp[j-s[i].a]+s[i].c);
        printf("%d\n",dp[m]);
    }
    return 0;
}

總結:今天就做了這兩個題,一個是K大值的揹包,一個是有前提的揹包,這幾天有得溜了!


今天搞懂了,特別補上,嘎嘎,物品(A,B,C)表示這個物品金額爲A,價值爲C,要買它必須金錢不小於B,於是有這樣的公式來對兩個物品進行優先級排序

A1+B2和A1+B1比較大小,這兩個分別表示先A再B和先B再A的起始最小金錢量,因爲金錢量是給定的,所以這個最小金錢量越小越好。

比如兩個物品

a:1 3 5

b:2 5 5

A1+B2=1+5=6     A2+B1=2+3=5

明顯應該是先B再A,比較公式A2+B1<A1+B2也變形爲B2-A2>B1-A1這下上面的問題就清楚了,嘎嘎嘎,我真機智,愛死自己了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章