#include <iostream>
using namespace std;
#include <vector>
int main() {
int m, n;
cin >> m >> n;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
//dp数组,dp[i][j]表示 i个苹果放在j个盘子里有几种放法
//初始化dp数组,1个盘子不论多少苹果都只有1种放法
for (int i = 1; i <= m ; i++) {
dp[i][1] = 1;
}
//初始化dp数组,,这种特殊情况值要给1,其实可以不用理解为0个苹果j个盘子有1种放法。
for (int j = 1; 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][i];
}
else{
dp[i][j] = dp[i -j][j] + dp[i][j - 1];//有盘子空着,即为dp[i][j-1],无盘子空着即为dp[i-j][j]
}
}
}
cout << dp[m][n] << endl;
}
动态规划不太好理解,主要是苹果数大于等于盘子数时,需要将有盘子空着与无盘子空着2种情况相加
dp[i-j]就是将苹果在每个盘子都放一个,之后剩下的苹果的所有情况,也就是无盘子空着的情况
如果i == j,也就是dp[0][j],这个需要初始化,苹果盘子数目相等,又要没有空盘子,所有这种特殊情况值要给1,其实可以不用理解为0个苹果j个盘子有1种放法。

京公网安备 11010502036488号