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 @ US$3 + 1 @ US$2
1 @ US
1 @ US
2 @ US
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
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
用1到k的硬幣能組成n的方法總數。
簡單的dp
dp[i] = dp[i] + dp[i - k];
但是這題爆ll,手動開兩個ll,一個存高位,一個存低位就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<utility>
#include<sstream>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
const ll mod = 1e16;
ll dp[2][1005];
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\ΡΡ\\Desktop\\in.txt","r",stdin);
//freopen("C:\\Users\\ΡΡ\\Desktop\\out.txt","w",stdout);
#endif // LOCAL
ll n,k;
scanf("%lld%lld",&n,&k);
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(ll i = 1;i <= k;i++)
{
for(ll j = i;j <= n;j++)
{
dp[0][j] = dp[0][j] + dp[0][j - i];
dp[1][j] = dp[1][j] + dp[1][j - i] + dp[0][j]/mod;
dp[0][j] = dp[0][j]%mod;
}
}
if(dp[1][n])
printf("%lld",dp[1][n]);
printf("%lld\n",dp[0][n]);
return 0;
}