Hduoj3033【分组背包】

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#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,否则输出最大价值。

你可能感兴趣的:(Hduoj3033【分组背包】)