POJ 3181 Dollar Dayz

题目链接:(—_—) zZ


题目大意:long long ago 有一个商店, 它里面卖的东西价格为[1¥...k¥]区间内的, 每种价格的物品都有无限件, 现有n元,要求花完这n元买物品, 求出能买物品搭配方式的总数


思路:这题是在背包问题里面的题, 不过不会做, 参考了大牛的思路


code:

#include <stdio.h>
#include <string.h>
#define inf 10000000000000000
int main()
{
    int i = 0, j = 0, n = 0, k = 0;
    __int64 a[1002], b[1002];
    while(scanf("%d %d", &n, &k) != EOF )
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        a[0] = 1;
        for(i = 1; i<=k; i++)
            for(j = i; j<=n; j++)
            {
                b[j] = b[j]+b[j-i]+(a[j]+a[j-i])/inf;
                a[j] = (a[j]+a[j-i])%inf;
            }
        if(b[n]) printf("%I64d", b[n]);
        printf("%I64d\n", a[n]);
    }
    return 0;
}

code:

#include <stdio.h>
#include <string.h>
int main()
{
    int i = 0, j = 0, k = 0 , l = 0, n = 0, s = 0;
    __int64 dp[1002][10];
    while(scanf("%d %d", &n, &k) != EOF )
    {
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for(i = 1; i<=k; i++)
            for(j = i; j<=n; j++)
            {
                for(l = 0; l<9; l++)
                {
                    dp[j][l] += dp[j-i][l];
                    if(dp[j][l]>10000)
                    {
                        dp[j][l] %= 10000;
                        dp[j][l+1]++;
                    }
                }
            }
        i = 8;
        while(dp[n][i] == 0)
         i--;
        printf("%I64d", dp[n][i--]);
        while(i>=0)
        {
            printf("%.4I64d", dp[n][i]);
            i--;
        }
    }
    return 0;
}

你可能感兴趣的:(POJ 3181 Dollar Dayz)