hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

来源:互联网 发布:淘宝国际转运 日本 编辑:程序博客网 时间:2024/05/17 00:55

解题思路:多重背包


AC代码:

#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define clr(p,v) memset(p,v,sizeof(p))const int maxn = 100010 ;int n, m, C;int d[110];void zeroOnePack(int cost, int weight){    for (int i=m; i>=cost; --i)        d[i] = max(d[i], d[i-cost]+weight);}void completePack(int cost, int weight){    for (int i=cost; i<=m; ++i)        d[i] = max(d[i], d[i-cost]+weight);}void multiPack(int cost, int weight, int amount){    if (cost*amount >= m)        completePack(cost, weight);    else    {        int num = 1;        while (num <= amount)        {            zeroOnePack(num*cost, num*weight);            amount -= num;            num <<= 1;        }        zeroOnePack(amount*cost, amount*weight);    }}int main(){    scanf("%d", &C);    while (C--)    {        //Input && Calculate        clr(d, 0);        scanf("%d%d", &m, &n);        for (int i=1; i<=n; ++i)        {            int p, w, c;            scanf("%d%d%d", &p, &w, &c);            multiPack(p, w, c);        }        //output        printf("%d\n", d[m]);    }    return 0;}


原创粉丝点击