放苹果
链接:https://www.nowcoder.com/questionTerminal/a2a1d0266629404fba582d416d84b6a0
来源:牛客网
来源:牛客网
把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
输入描述:
输入包含多组数据。
每组数据包含两个正整数 m和n(1≤m, n≤20)。
输出描述:
对应每组数据,输出一个整数k,表示有k种不同的分法。
示例1
输入
7 3
输出
8
递归解法:
动态规划解法
//首先两个循环吧m = 0和n = 1的元素都置位1。然后在一个双重循环逐一计算dp[i][j]的值。 //若i < j,dp[i][j] = dp[i][i],苹果比盘子少,肯定有空盘子,空盘子不影响,可以直接去掉。 //若i >= i,dp[i][j] = dp[i][j - 1] + dp[i - j][j],苹果比盘子多,即至少有一个盘子空着的情况(dp[i][j - 1] )加上所有盘子都不空(每个盘子去掉一个苹果,即去掉j个苹果,dp[i - j][j])的情况。 //最后输出dp[m][n]即可。 func getAppleAns(m,n int) int{ //m是盘子数,n是苹果数 dp:=make([][]int,0,m+1)//dp[i][j]表示i个苹果放j个盘子的方法数 for i:=0;i<=m;i++{ dp=append(dp,make([]int,n+1)) } for i:=0;i<=n;i++{//0个苹果放i个盘子 dp[0][i]=1 } for i:=1;i<=m;i++{//1个盘子放i个苹果 dp[i][1]=1 } for i:=1;i<=m;i++{//苹果数 for j:=1;j<=n;j++{//盘子数 if i<j{ //盘子比苹果多并不会增加分法 dp[i][j] = dp[i][i] } else {//盘子比苹果少,等于至少有一个空盘,加上0个空盘的情况(每个盘子都有一个苹果,剩下的i-j个都随机放到一个盘子的情况) dp[i][j] = dp[i][j - 1] + dp[i - j][j] } } } return dp[m][n] }
参考博客:https://www.cnblogs.com/wxgblogs/p/5742618.html
等风起的那一天,我已准备好一切