Dollar Dayz
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5736 | Accepted: 2150 |
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$1Write 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 的物品,要刚好把这n元花完,问共有多少种方式。递推公式 ans[ i ][ j ] = ans[ i ][ j-1] + ans[ i-j ][ j ] 。个人理解是 i 元 j 价格的方法数可看做 i 元 j-1 价格的方法数(即在此所有方法上加一个价格为1 ) 加上用 第 j 价格的物品花完 i 元的方法数,其中必存在一件物品的价格为 j 则剩下 i-j 元,所以用 j 价格物品花完 i 元的方法数即为 ans[ i-j ][ j ] 。当然这里肯定存在 j > i-j ,我这里将这种情况的方法数等同于 ans[ i ][ i ]。之后就是 ans[ i ][ j ] 的数据范围了,即使是int64位仍然不够,用两个int64位存一个值,恩,像8位存储数据方式的高四位和第四位一样。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
#define maxn 1010
#define inf 9000000000000000000
//#define inf 9223372036854775807这个是int64位可表示的最大数值,2^63-1 但是这里会运行错误
using namespace std;
LL a,b;
LL ans[maxn][110][2];
void fun()
{
ans[0][0][0]=1;
for(int i=1;i<=100;++i)
{
ans[0][i][0]=1;
ans[1][i][0]=1;
ans[1][i][1]=0;
}
for(int i=2;i<=1000;++i)
{
for(int j=1;j<=100;++j)
{
if(j<=i)
{
ans[i][j][0]=(ans[i][j-1][0]+ans[i-j][j][0])%inf;
ans[i][j][1]=(ans[i][j-1][0]+ans[i-j][j][0])/inf+ans[i][j-1][1]+ans[i-j][j][1];
}
else
{
ans[i][j][0]=ans[i][i][0];
ans[i][j][1]=ans[i][i][1];
}
}
}
}
int main()
{
int n,k;
fun();
while(~scanf("%d%d",&n,&k))
{
if(ans[n][k][1])
printf("%lld%lld\n",ans[n][k][1],ans[n][k][0]);
else
printf("%lld\n",ans[n][k][0]);
}
return 0;
}