Proud Merchants
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.
這是個有前提的揹包問題,主要是判斷物品出場的順序,本人表示跟上一題一樣,準備作死的節奏,就不解析了,等弄明白了再加上
#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這下上面的問題就清楚了,嘎嘎嘎,我真機智,愛死自己了