思路
思路参考: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; } }