hdu 4501 小明系列故事——买年货 多重背包
我们设置一个dp[j][r][x]表示花j元,r积分,免费拿x次所得的最大价值。那么dp[j][r][x]=Max(dp[j-a[i]][r][x],dp[j][r-b[i]][x],dp[j][r][x-1]);
这里最坑爹的是尽然有0元物品与0积分物品,害的我WA了好几次。所有要用一个temp来记录最大值,最后再赋值给dp[j][r][x];
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; #define Max(a,b) (a)>(b)?(a):(b) int dp[110][110][6]; int a[110],b[110],val[110]; int main() { int n,m,i,j,k,t,v1,v2,r,x; while(scanf("%d%d%d%d",&n,&v1,&v2,&k)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&val[i]); int temp=0; for(i=1;i<=n;i++) { for(j=v1;j>=0;j--) for(r=v2;r>=0;r--) for(x=k;x>=0;x--) { temp=0; if(x>=1) temp=Max(temp,dp[j][r][x-1]+val[i]); if(r>=b[i]) temp=Max(temp,dp[j][r-b[i]][x]+val[i]); if(j>=a[i]) temp=Max(temp,dp[j-a[i]][r][x]+val[i]); dp[j][r][x]=Max(temp,dp[j][r][x]); } } printf("%d\n",dp[v1][v2][k]); } return 0; }