思路

思路参考:https://blog.nowcoder.net/n/58251c30a862488a98c511f048ae5eac?f=comment

dp[i][j]:i个盘子放j个苹果。

(苹果 j >盘子 i)时,可分为有空盘子和没空盘子的情况。

  • 有空盘子:第 i 个盘子为空,不放苹果 ==> i-1个盘子放 j 个苹果,即 dp[i-1][j]
  • 没空盘子:那么每个盘子至少放一个苹果,剩下 j-i 个苹果 ==> i 个盘子放(j-i)个苹果,即dp[i][j-i]

综上,

  • 当 j<i 时,dp[i][j] = dp[i-1][j]
  • 当 j>=i 时,dp[i][j] = dp[i-1][j] + dp[i][j-i];

Code

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int m,n;
    while(cin>>m>>n) {
        vector<int> dp(m+1, 1);
        for(int i = 2; i<=n; i++) {
            for(int j = i; j<=m; j++) {
                dp[j] = dp[j] + dp[j-i];
            }
        }
        cout << dp[m] << endl;
    }
}