http://acm.hdu.edu.cn/showproblem.php?pid=3466
在01背包的基础上加了个拿物品时至少拥有一定财富才可以拿的限制,那么只要把样例模拟一下就知道需要对dp[i]的更新要尽量从小更新,就是能早一点更新dp[1]就早更新,即拿东西的时候,从限制较大的东西开始拿,但是更新dp数组的数是反过来,限制越小的东西越早用来更新。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
int w,q,v;
}ite[11111];
int dp[11111];
int n;
int m;
bool cp1(const node &x,const node &y)
{
return x.q-x.w<y.q-y.w;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(dp,0,sizeof(dp));
int i,j;
for(i=0;i<n;i++)
{
cin>>ite[i].w>>ite[i].q>>ite[i].v;
}
sort(ite,ite+n,cp1);
for(i=0;i<n;i++)
{
for(j=m;j>=ite[i].q&&j>=ite[i].w;j--)
{
dp[j]=max(dp[j],dp[j-ite[i].w]+ite[i].v);
}
}
cout<<dp[m]<<endl;
}
return 0;
}