POJ 3181 Dollar Dayz

来源:互联网 发布:mac dos模拟器 编辑:程序博客网 时间:2024/05/17 01:43

题目链接:(—_—) zZ


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


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


code:

#include <stdio.h>#include <string.h>#define inf 10000000000000000int 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;}