题目链接:点击打开链接
题意:把n这个整数划分为不多于k个正整数相加的形式,那么一共有多少种分解的方式呢?
题解:对于要划分的n来说,和k有以下三种关系
1. n < k时
很明显n最多只能划分成n个数字。
所以当n<k时
dp【i】【j】 = dp【i】【i】;
2.当n == k时
分成两种情况。第一种就是把n分成n份,很明显是就只有一种
第二种是至少有一个数为0。就是把n分成k-1份
所以dp【i】【j】 = dp【i】【j-1】 + 1;
3当 n > k时
也分为两种情况
第一种:至少一个为0的,就是把n分成k-1份
第二种是先将j分出来,然后将i-j再分成j份,此时相当于a[i-j][j];
dp[i][j] = dp[i-j][j] + dp[i][j-1];
所以代码实现如下:
#include<iostream>
using namespace std;
const int maxn = 505;
long long a[maxn][maxn];
int main(){
long long n,k;
cin >> n >> k ;
for(int i = 1 ; i <= n ; i ++)
a[i][1] = 1;
for(int j = 1 ; j <= k ; j ++)
a[1][j] = 1;
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= k ; j ++){
if(i < j)
a[i][j] = a[i][i];
else if(i == j)
a[i][j] = a[i][j-1] + 1;
else if(i > j)
a[i][j] = a[i-j][j] + a[i][j-1];
}
}
cout << a[n][k] ;
return 0;
}