poj 3181 Dollar Dayz
Posted ZefengYao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 3181 Dollar Dayz相关的知识,希望对你有一定的参考价值。
Dollar Dayz
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8672 | Accepted: 3233 |
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$2Write 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).
1 @ US$3 + 2 @ US$1
1 @ US$2 + 3 @ US$1
2 @ US$2 + 1 @ US$1
5 @ US$1
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
Source
题意:用n元去兑换价值不超过k的物品,求有多少兑换方法
思路:dp[i][j]:用前i种价格配出价值j的方案数
则dp[i][j]=dp[i-1][j]+dp[i-1][j-i]+...+dp[i-1][j-k*i];其中k=floor(j/i)
这样直接做还是比较慢的,可以继续化简:
当上式中的j=j-i时
dp[i][j-i]=dp[i-1][j-i]+...+dp[i-1][j-k*i];
则dp[i][j]=dp[i-1][j]+dp[i][j-i];
这样一来就可以少用一层循环了
还要注意数据过大,long long存不下,可以采用高低位存储数大数
AC代码:
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; typedef unsigned long long ll; #define N_MAX 1000+20 #define K_MAX 100+20 #define MOD 100000000000000000 int n, k; ll dp[K_MAX][N_MAX][2]; int main() { scanf("%d%d",&n,&k); dp[0][0][1] = 1; for (int i = 1; i <= k;i++) { dp[i][0][1] = 1; for (int j = 1; j <= n;j++) { if (j >= i) { dp[i][j][0] = dp[i - 1][j][0] + dp[i][j - i][0]; dp[i][j][1] = dp[i - 1][j][1] + dp[i][j - i][1]; dp[i][j][0] += dp[i][j][1] / MOD; dp[i][j][1] %= MOD; } else { dp[i][j][0] = dp[i - 1][j][0]; dp[i][j][1] = dp[i - 1][j][1]; } } } if (dp[k][n][0]) { cout << dp[k][n][0]; } cout << dp[k][n][1]<<endl; return 0; }
以上是关于poj 3181 Dollar Dayz的主要内容,如果未能解决你的问题,请参考以下文章