题目描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0<=m<=10,1<=n<=10。
本题含有多组样例输入。
输入描述:
输入两个int整数
输出描述:
输出结果,int型
示例1
输入:
7 3
复制
输出:
8
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
/*
设f[m][n]为将m分成最多n份的方案数,且其中的方案不重复,即每个方案前一个份的值一定不会比后面的大,序列是一个不降序列。
当m>=n时,f[m][n] = f[m][n - 1] + f[m - n][n]
f[m][n - 1]相当于第一盘子中为0,有空盘子,只用将数分成n - 1份即可。因为0不会大于任何数,相当于f[m][n - 1]中的方案前面加一个为0的盘子。
f[m - n][n]相当于在每个盘子中加一个数1,没有空盘子。因为每个盘子中加一个数1不会影响f[m][n - 1]中的方案的可行性,也不会影响f的定义。
当m<n的时候,肯定最少有n-m个空盘子,问题就是把m个苹果放到m个盘子有多少种方法了。f[m][n]=f[m][m)] m<n
临界条件,n=1时,所有苹果都放在同一个盘子里 f(m,n)=1m<=1时,没有苹果,f(m,n)=1
*/
func main() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
text := strings.Split(strings.Trim(input.Text(), " "), " ")
m, _ := strconv.Atoi(text[0])
n, _ := strconv.Atoi(text[1])
fmt.Println(f1(m, n))
}
}
func f1(m, n int) int {
if m <= 1 || n == 1 {
return 1
} else if m < n {
return f1(m, m)
} else {
return f1(m, n-1) + f1(m-n, n)
}
}