题目描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0<=m<=10,1<=n<=10。
本题含有多组样例输入。
解题思路:
动态规划,两种情况:1.如果有空盘子,那么,相当于缩减为m个苹果放在n-1个盘子里的问题
2.如果没有空盘子,那么必须保证每个盘子都有一个苹果,那么相当于缩减为m-n个苹果放在n个盘子的问题
遇到的问题:
1.这个i-j>=0没写出来,如果苹果数量小于盘子数量,那么没有办法实现情况2,因此直接为0
dp[i][j] = dp[i][j-1]+(i-j>=0?dp[i-j][j]:0);
2.我不知道初始化dp应该写到什么程度,是把所有已知值都写上嘛?
#include<iostream>
#include<vector>
using namespace std;
int main(){
int m,n;
while(cin>>m>>n){
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for(int i=0;i<=m;i++){
dp[i][1] = 1;
}
for(int i=0;i<=n;i++){
dp[0][i] = 1;
dp[1][i] = 1;
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){
dp[i][j] = dp[i][j-1]+(i-j>=0?dp[i-j][j]:0);
}
}
cout<<dp[m][n]<<endl;
}
}