理解苹果多于盘子的情况/C++
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
#include<iostream>
#include <vector>
using namespace std;
/*
这个题主要就是要理解当苹果数大于盘子数的时候。
如果需要全部放满,那很容易,就是将每个盘子先放一个,再处理剩下的苹果,因此为 PutApple(m - n, n)
如果不全部放满,即至少有一个盘子是空的。这个时候为什么就是PutApplem, n - 1),而不是继续加上PutApple(m, n - 2)..PutApple(m, n - 3)?
这是因为,我们*没有具体讨论到底有几个盘子是空的*,拿掉一个盘子之后的问题包含了所有可能的空盘子的个数。
*/
int PutApple(int m, int n){
if(m == 0 || n == 1)
return 1;
else if(m < n)
return PutApple(m,m);
else
return PutApple(m -n , n) + PutApple(m, n-1);
}
int PutApple_dp(int m, int n){
// vector<vector<int> > dp(m+1, vector<int>(n+1,1));
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for(int i = 1; i <= n; i++)
dp[0][i] = 1; //0个苹果只有1种分法
// for(int i = 1; i <= m; i++)
// dp[i][0] = 0; //0个盘子有0种分法
for(int i = 1; i <=m; i++){
for(int j = 1; j <=n; j++){
if(i < j)
dp[i][j] = dp[i][i];
else
dp[i][j] = dp[i-j][j] + dp[i][j-1];
}
}
return dp[m][n];
}
int main(){
int m, n;
while(cin >> m >> n) //输入苹果数和盘子数
cout << PutApple_dp(m, n) << endl; //递归解决
return 0;
}
腾讯公司福利 1155人发布