题目:点击打开链接
题意:
普通的01背包,多了一个q,现在剩余钱数大于q是才能买这个。p,v分别为花费和价值。
思路:
这也比较难想,其实放两个物品,需要的空间不只是p1+p2,如果先放1,需要q1+p2,先放2,需要p1+q2。
所以要先对这个排下序。
(这个排序很智能啊,这怎么实现的,我这么写也能排好)
#include<bits/stdc++.h>
using namespace std;
int dp[10001];
struct node{
int p,q,v;
}t[501];
bool cmp(node a,node b){
return a.p+b.q>a.q+b.p;
}
int main(){
int n,m;
while(cin>>n>>m){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>t[i].p>>t[i].q>>t[i].v;
sort(t+1,t+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=m;j>=t[i].p&&j>=t[i].q;j--)
dp[j]=max(dp[j],dp[j-t[i].p]+t[i].v);
cout<<dp[m]<<endl;
}
return 0;
}