poj - 1276 - Cash Machine(dp)

題意:N(0 <=N <= 10)種錢,每種 ni(0 <= ni <= 1000) 張,每張 Di(1 <= Di <= 1000) 元,問合成不超過 cash(0 <= cash <= 100000) 的最大值是多少。

題目鏈接:http://poj.org/problem?id=1276

——>>多重揹包。。

卡了一下內存。。所以,用滾動數組。。

#include <cstdio>

const int MAXN = 200;
const int MAXC = 100000;

int cash;
int N;
int ret;
int D[MAXN];
int cnt;
int dp[MAXC + 10];

void GetNew(int n, int d)
{
    int num = 1;

    while (n >= num)
    {
        D[++cnt] = d * num;
        n -= num;
        num <<= 1;
    }
    if (n)
    {
        D[++cnt] = d * n;
    }
}

void Read()
{
    int n, d;

    cnt = 0;
    scanf("%d", &N);
    for (int i = 1; i <= N; ++i)
    {
        scanf("%d%d", &n, &d);
        GetNew(n, d);
    }
}

void Solve()
{
    dp[0] = 1;
    for (int i = 1; i <= cash; ++i)
    {
        dp[i] = 0;
    }
    for (int i = 1; i <= cnt; ++i)
    {
        for (int j = cash; j >= 0; --j)
        {
            dp[j] = dp[j];
            if (j - D[i] >= 0)
            {
                dp[j] += dp[j - D[i]];
            }
        }
    }
    for (int i = cash; i >= 0; --i)
    {
        if (dp[i])
        {
            ret = i;
            break;
        }
    }
}

void Output()
{
    printf("%d\n", ret);
}

int main()
{
    while (scanf("%d", &cash) == 1)
    {
        Read();
        Solve();
        Output();
    }

    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章