Dollar Dayz POJ - 3181 (完全背包 && 大数)
题目链接
题目大意:用1~k的数去凑n(每个数都有无限个),问有多少种凑法?
题目样例:
5(n) 3(k)
输出:5
这个题目就是普通的完全背包,但是他有一个特殊的地方就是n是1000 k是100 这样会爆longlong 于是看了别人的博客,是开两个dp数组,第一个记录前18位,第二个记录后18位就ok了。(为什么不用java, 据说这样的高精度会超时,没试)
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn = 1005;
const ll MOD = 1e18;
ll dp1[maxn], dp2[maxn];
int main()
{
int n, k;
scanf("%d %d", &n, &k);
dp2[0] = 1;
for(int i = 1; i <= k; i++) {
for(int j = i; j <= n; j++) {
dp1[j] = dp1[j] + dp1[j - i] + (dp2[j] + dp2[j - i]) / MOD;
dp2[j] = (dp2[j] + dp2[j - i]) % MOD;
}
}
if(dp1[n]) printf("%lld", dp1[n]);
printf("%lld\n", dp2[n]);
}