题解 | 放苹果
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
#include <bits/stdc++.h>
using namespace std;
int main(){
int m, n;
while(cin >> m >> n){
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); //dp[i][j]表示i个苹果放在j个盘子的分法
for(int i = 1; i <= n; i++)
dp[0][i] = 1; //0个苹果只有1种分法
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++){
if(i < j)
dp[i][j] = dp[i][j - 1];
//苹果数少于盘子数,则等于它前一个盘子时的分法,因为这个盘子相当于常空着,没有用
else
dp[i][j] = dp[i][j - 1] + dp[i - j][j];
//等于上一个盘子的数量(即相当于至少有这个盘子是空的)加上苹果数减去盘子数且盘子数不变时的分法
}
cout << dp[m][n] << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
查看14道真题和解析