链接:点击打开链接
题意:给出n个物品,和容量为m的背包,第i个物品的重量为p[i],价值为v[i],但必须当前背包的容量大于q[i]才可以放这个物品呢,求最大的价值
代码;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int p,q,v;
friend bool operator<(node a,node b){
return a.q-a.p<b.q-b.p;
}
}s[505];
int dp[5005];
int main(){ //假如s[a].p+s[b].p<=m则这两个物品都应该被
int n,m,i,j; //装入背包,但现在有了限制之后物品的重量可能
while(scanf("%d%d",&n,&m)!=EOF){ //就被当做s[a].q和s[b].q,也就有可能这两个物品
for(i=1;i<=n;i++) //就不能装入这个背包中,所以放入背包的顺序也对结果
scanf("%d%d%d",&s[i].p,&s[i].q,&s[i].v);//造成了影响
memset(dp,0,sizeof(dp));
sort(s+1,s+n+1); //当s[a].q<=s[a].q时跟普通01背包没有区别也就没有了
for(i=1;i<=n;i++){ //限制条件,所以关键在于s[a].q>s[a].p时,为了使转移
for(j=m;j>=max(s[i].q,s[i].p);j--) //到下个物品时,转移的范围最大,因此下限小应该先放入
dp[j]=max(dp[j],dp[j-s[i].p]+s[i].v);
} //背包,也就是按照s[a].q-s[a].p排序
printf("%d\n",dp[m]);
}
return 0;
}