#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;
}
hdu 4501多维背包入门
最新推荐文章于 2018-04-18 08:37:00 发布