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

京公网安备 11010502036488号