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;
}

 

posted @ 2013-05-27 23:54  fangguo  阅读(164)  评论(0编辑  收藏  举报