【golang】放苹果

题目描述

把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)
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值