hdu 4501多维背包入门

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

/*
本题属于多维背包,即有多种支付手段去买物品, 求用这些方式能买到的最大价值。
如本题可以用积分, 钱 , 免费拿去,三种方式得到物品, 求得到物品的最大价值。
这就是多维背包, 可以用dp[i][j][k] i表示用积分支付, j表示用钱支付。 k表示可以
免费领取这件物品。
*/
struct node {

    int money;
    int fen;
    int value;
}s[110];

int dp[110][110][8];
int v1, v2, m, n;


int main()
{
    int ans;
   while(scanf("%d%d%d%d", &n ,&v1, &v2, &m) != EOF) {

        for(int i = 0; i < n; i++)
            scanf("%d%d%d", &s[i].money, &s[i].fen, &s[i].value);
        memset(dp, 0, sizeof(dp));
        for(int i = 0; i < n; i++)
        for(int j = v1; j >= 0; j--) {  //这里不能用j >= S[i].money; 因为当j不能购买时k, l方式可能
                                          //可以购买。所以dp[j][k][l] 仍然要被枚举一次。

            for(int k = v2; k >= 0; k--) {

                for(int l = m; l >= 0; l--) {
                    ans = 0;
                    if(j - s[i].money >= 0)
                        ans = max(ans, dp[j-s[i].money][k][l] + s[i].value);
                    if(k - s[i].fen >= 0)
                        ans = max(ans, dp[j][k-s[i].fen][l]+ s[i].value);
                    if(l -1 >= 0)
                        ans = max(ans, dp[j][k][l-1]+ s[i].value);
                    dp[j][k][l] = max(ans, dp[j][k][l]);
                }
            }
        }
        printf("%d\n", dp[v1][v2][m]);
   }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值