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;

}

 

你可能感兴趣的:(HDU)