poj3181

来源:互联网 发布:刷qq会员软件 编辑:程序博客网 时间:2024/06/11 01:11
Dollar Dayz
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7649 Accepted: 2855

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的之来组合,有多少种方案。


思路:这题就用当做完全背包来做,但是这个数据会超出long long int所以开了一个MOD,大于MOD时分两部分输出就可以了。


代码:

#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const long long int MOD=1e18;long long int d1[1005],d2[1005];int main(){    int N,K;    while(scanf("%d%d",&N,&K)!=EOF)    {        int i,j;        memset(d1,0,sizeof(d1));        memset(d2,0,sizeof(d2));        d2[0]=1;        for(i=1;i<=K;i++)        {            for(j=i;j<=N;j++)            {                d1[j]=d1[j]+d1[j-i]+(d2[j]+d2[j-i])/MOD;                d2[j]=(d2[j]+d2[j-i])%MOD;            }        }        if(d1[N])cout<<d1[N];        cout<<d2[N]<<endl;    }    return 0;}


原创粉丝点击