有m个同样的苹果,认为苹果之间无差别,
有n个同样的盘子,认为盘子之间也无差别,
还有,比如5个苹果如果放进3个盘子,
那么1、3、1和1、1、3和3、1、1的放置方法,也认为是一种方法。
如上的设定下,返回有多少种放置方法。
数的分裂。
自然智慧,递归。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
ret := ways3(5, 4)
fmt.Println(ret)
}
var dp [][]int
func ways3(apples, plates int) int {
if dp == nil {
dp = make([][]int, 11)
for i := 0; i < 11; i++ {
dp[i] = make([]int, 11)
}
for i := 0; i <= 10; i++ {
for j := 0; j <= 10; j++ {
dp[i][j] = -1
}
}
}
return process3(apples, plates, dp)
}
func process3(apples, plates int, dp [][]int) int {
if dp[apples][plates] != -1 {
return dp[apples][plates]
}
ans := 0
if apples == 0 {
ans = 1
} else if plates == 0 {
ans = 0
} else if plates > apples {
ans = process3(apples, apples, dp)
} else {
ans = process3(apples, plates-1, dp) + process3(apples-plates, plates, dp)
}
dp[apples][plates] = ans
return ans
}
执行结果如下: