题意:起初看不懂,看了别人的解释,意思是:用K个1~M的数组成的和是N的个数有多少,那就是简单的递推了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 60;
int m;
long long dp[MAXN][MAXN];
long long solve(int n,int k){
long long &temp = dp[n][k];
if (temp != -1)
return dp[n][k];
if (n == 0 && k == 0)
return temp = 1;
if (n == 0)
return temp = 0;
if (k == 0)
return 0;
temp = 0;
for (int i = 1; i <= m; i++){
if (n-i < 0)
break;
temp += solve(n-i,k-1);
}
return temp;
}
int main(){
int n,k;
while (scanf("%d%d%d",&n,&k,&m) != EOF){
memset(dp,-1,sizeof(dp));
printf("%lld\n",solve(n,k));
}
return 0;
}