#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
/*
本题是很好的分组背包题目;难点在于如何知道每种牌子的鞋, 都买了至少一双,
自己没有思路, 看别人的代码, 关键在于对dp[][]的初始化,
这样做 memset(dp, -1, sizeof(dp));
memset(dp[0], 0, sizeof(dp[0]));
*/
struct node {
int num;
int money;
int value;
}s[105];
int dp[105][10005];
int n, m, v;
int main()
{
while(scanf("%d%d%d", &n, &v, &m) != EOF) {
for(int i = 0; i < n; i++) {
scanf("%d%d%d", &s[i].num, &s[i].money, &s[i].value);
}
memset(dp, -1, sizeof(dp));
memset(dp[0], 0, sizeof(dp[0]));
for(int i = 1; i <= m; i++) {
for(int j = 0; j < n; j++) {
for(int k = v; k >= s[j].money; k--) {
if(s[j].num == i) {
dp[i][k] = max(dp[i][k], max(dp[i][k-s[j].money] + s[j].value, dp[i-1][k - s[j].money] + s[j].value));
} //dp[i][k-s[j].money] + s[j].value 和dp[i-1][k - s[k-s[j].money] + s[j].value中, 要选择第i个,
// 则必须i的前一个
} //被选中,否则不可能选择第i个, 所以当dp[m][v] >= 0 时,证明所有的
//品牌都应该被选择过。
}
}
if(dp[m][v] >= 0)
printf("%d\n", dp[m][v]);
else
printf("Impossible\n");
}
return 0;
}
hdu3033I love sneakers! 分组背包
最新推荐文章于 2021-05-15 20:18:27 发布