理解苹果多于盘子的情况/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; }