dp[i][j]表示i个苹果考虑放进j个盘子里面
考虑的意思就是不一定都会用到这j个盘子
if(i>=j){
dp[i][j] = dp[i-j][j] + dp[i][j-1];
}else{
dp[i][j] = dp[i][i];
}
#include<iostream>
#include <string.h>
using namespace std;
typedef long long ll;
#define debug(x) cout<<#x<<": "<<(x)<<endl;
int dp[11][11];
void cal(int m,int n){
memset(dp,sizeof(dp),0);
dp[0][0] = 0;
for(int i=0;i<=m;i++){
dp[i][1]= 1;
}
for(int j=0;j<=n;j++){
dp[0][j]= 1;
}
for(int i=1;i<=m;i++){
for(int j=2;j<=n;j++){
if(i>=j){
dp[i][j] = dp[i-j][j] + dp[i][j-1];
}else{
dp[i][j] = dp[i][i];
}
}
}
cout<<dp[m][n]<<endl;
}
int main(){
int m=0;
int n=0;
int t=0;
cin>>t;
for(int i=0;i<t;i++){
cin>>m;
cin>>n;
cal(m,n);
}
return 0;
}
关于整数的无序拆分除了递归的办法,还有母函数的方法
链接