思路:
动态规划。大数处理。高位是dp/mod,低位是dp%mod。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
//思路:参考完全背包问题。
//因为数很大,long long也存不下,所以要分高低位
int n,m;
long long int dp_low[1005],dp_high[1005]; //可使用i元时的方法数
long long int mod = 1e18;
int main()
{
int i,j,k;
scanf("%d %d",&n,&m);
dp_low[0] = 1;
for(j = 1; j <= m; j++){
for(i = j; i <= n; i++){
dp_high[i] = dp_high[i] + dp_high[i-j];
dp_high[i] += (dp_low[i] + dp_low[i-j])/mod;
dp_low[i] = (dp_low[i] + dp_low[i-j])%mod; //是否选价值j的工具
}
}
if(dp_high[n]) printf("%lld",dp_high[n]);
printf("%lld\n",dp_low[n]);
return 0;
}