Dollar Dayz(DP)

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.FarmerJohnhasexactly 5 to spend. He can buy 5 tools at 1eachor1toolat 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 @ US3+2@US 1
1 @ US2+3@US 1
2 @ US2+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

用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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章