当前位置:网站首页>I - Dollar Dayz

I - Dollar Dayz

2022-06-26 12:40:00 YJEthan

Description

Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first visit, the tools are selling variously for $1, $2, and $3. Farmer John has exactly $5 to spend. He can buy 5 tools at $1 each or 1 tool at $3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:

        1 @ US$3 + 1 @ US$2 
 1 @ US$3 + 2 @ US$1 
 1 @ US$2 + 3 @ US$1 
 2 @ US$2 + 1 @ US$1 
 5 @ US$1
Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).

Input

A single line with two space-separated integers: N and K.

Output

A single line with a single integer that is the number of unique ways FJ can spend his money.

Sample Input

5 3

Sample Output

5

题目的大致意思是:用n钱去买价值1~k的物品,物品可重复购买,请问最多有多少种购买的组合方式


递推公式1.i>=j dp[I][j]=dp[I][j-1]+dp[I-j][j]

               2.i<j dp[I][j]=dp[I][I]

由于结果比较大 故用两个ll数组存放结果


有个问题一直没解决就是最后输出的时候 如果低位低于17位,而高位不等于0,这种输出显然是不对的,求大佬解答

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ll long long
ll a[10009][108],b[10009][106];
ll inf;
int main()
{
    int n,m,i,j;
    inf=1;
    for(i=1;i<=18;i++)
    {
        inf=inf*10;
    }
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(i=1;i<=m+1;i++)
        {
            a[0][i]=1;
        }
        for(i=1;i<=n+1;i++)
        {
            a[i][1]=1;
        }
        for(i=1;i<=m+1;i++)
        {
            a[1][i]=1;
        }
        for(i=2;i<=n;i++)
        {
            for(j=2;j<=m;j++)
            {
                if(i<j)
                {
                    a[i][j]=a[i][i];
                    b[i][j]=b[i][i];
                }
                else
                {
                    a[i][j]=(a[i][j-1]+a[i-j][j])%inf;
                    b[i][j]=b[i][j-1]+b[i-j][j]+(a[i][j-1]+a[i-j][j])/inf;
                }//printf("%d ",a[i][j]);
            }
        }
        if(b[n][m]!=0)
            printf("%lld",b[n][m]);
        printf("%lld\n",a[n][m]);
    }
}



原网站

版权声明
本文为[YJEthan]所创,转载请带上原文链接,感谢
https://blog.csdn.net/YJEthan/article/details/75046199