放苹果

链接:https://www.nowcoder.com/questionTerminal/a2a1d0266629404fba582d416d84b6a0
来源:牛客网

把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意: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

posted @ 2022-06-28 21:06  知道了呀~  阅读(134)  评论(0编辑  收藏  举报