利用动态规划求解。
当m >= n时,要么每个盘子至少有一个苹果,要么至少有一个空盘子,所以dp[ i ][ j ] = dp[ i ][ j - 1 ] + dp[ i - j ][ j ]。
当m < n时,则至少有n - m个盘子空着,即最多有m个盘子有苹果,所以dp[ i ][ j ] = dp[ i ][ i ]。
边界条件,当只有一个盘子或者没有苹果的时候,只有一种放法。
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10 + 10;
int dp[N][N];
int main(){
int m, n;
while(scanf("%d%d", &m, &n) != EOF){
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 = 1; j <= n; j++){
if(j <= i) dp[i][j] = dp[i][j - 1] + dp[i - j][j];
else dp[i][j] = dp[i][i];
}
}
printf("%d\n", dp[m][n]);
}
return 0;
}