dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)
题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。
mark:又是变种01背包,每做一个变种的,就是一种提高。。
按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN=5005; int dp[MAXN]; struct Node { int p,q,v; }node[505]; bool cmp(Node a,Node b) { return (a.q-a.p)<(b.q-b.p); } int main() { int n,m; int i,j; int p,q,v; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=m;i++) dp[i]=0; for(i=0;i<n;i++) { scanf("%d%d%d",&node[i].p,&node[i].q,&node[i].v); } sort(node,node+n,cmp); for(i=0;i<n;i++) { for(j=m;j>=node[i].p;j--) { if(j>=node[i].q) dp[j]=max(dp[j],dp[j-node[i].p]+node[i].v); } } int ans=0; for(i=1;i<=m;i++) if(ans<dp[i]) ans=dp[i]; printf("%d\n",ans); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。