hdu1114 Piggy-Bank

来源:互联网 发布:数据分析相关分布 编辑:程序博客网 时间:2024/05/21 17:34

解题思路:完全背包

注意要初始 d[0] = 0


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 = 10010 ;int n, m, C;int d[maxn];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        int tt;        scanf("%d%d%d", &tt, &m, &n);        m -= tt;        //init d[]        for (int i=1; i<=m; ++i)            d[i] = -500000010;        d[0] = 0;                for (int i=1; i<=n; ++i)        {            int p, w;            scanf("%d%d", &p, &w);            completePack(w, -p);        }        //output        if (-d[m] != 500000010 && d[m])            printf("The minimum amount of money in the piggy-bank is %d.\n", -d[m]);        else            puts("This is impossible.");    }    return 0;}


原创粉丝点击