#include
#include
#include
#include
#define Min -100000000
int N, M, brand;
int va[11][10010];
struct shoe
{
int br, pay, value;
}B[110];
int max(int x, int y)
{
return x>y?x:y;
}
int cmp(const void *a, const void *b)
{
return (*(struct shoe *)a).br - (*(struct shoe *)b).br;
}
int main()
{
int i, j, k;
while(scanf("%d%d%d", &N, &M, &brand) != EOF)
{
memset(va, 0, sizeof(va));
for(i = 1; i <= N; ++i)
scanf("%d%d%d", &B[i].br, &B[i].pay, &B[i].value);
qsort(B+1, N, sizeof(B[0]), cmp);
for(i = 1; i <= brand; ++i)
for(j = 0; j <= M; ++j)
va[i][j] = Min;
j = 1;
for(i = 1; i <= brand; ++i)
{
for(; B[j].br == i; ++j)//when the brand is the i
{
for(k = M; k >= B[j].pay; k--)
{
va[i][k] = max(max(va[i][k], va[i][k-B[j].pay] + B[j].value) , va[i-1][k-B[j].pay] + B[j].value);
}
}
}
if(va[brand][M] < 0)
printf("Impossible\n");
else
printf("%d\n", va[brand][M]);
}
return 0;
}
题意:给出n个品牌,每个品牌至少要购买一件,每一件物品对应一个价值,给出m的总钱数,求这m的总钱数所能购买到得最大价值。
思路:这题很明显是背包问题,但有一个难点就是如何在保证每个品牌至少每一件的前提下,求出最大价值。事先定义价值的初始值为负无穷大,然后对数组的0维度初始化为0,最后进行dp,如果最终的答案为负数,说明有某件品牌没有被买到,输出Impossible,否则输出最大价值。