蓝桥杯-数的划分(递归法详解)

一、题目回顾

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下⾯三种分法被认为是相同的:
1,1,5;

1,5,1;

5,1,1;
问有多少种不同的分法。
输⼊格式
n,k
输出格式
⼀个整数,即不同的分法
样例输⼊
7 3
样例输出

二、分析

使用递归来计算将整数 n 分成 k 份的方式。
我们首先找到规律,当 n 和 k 都给定时,我们可以考虑第一份的大小,它可以从 1 到 n/k 中选择,
第2份、第3份...都不能小于第一份的大小。
例如n=7,k=3,则n/k=2
则情况为:
            1 1 5
            1 2 4
            1 3 3
            2 2 3
若第一份在继续下去,则会出现重复。

一旦我们确定了第一份的大小,剩余的部分是将剩余的数字 (n - 第一份的大小) 分成 (k - 1) 份。
我们继续递归地对这些剩余的部分进行相同的过程,找结束条件:
若k=1,且n>0,那么这时只有1种情况;
若k=1,且n=0,则有0种情况(不够分);
若k=n,则也只有1种情况(例如n=7,k=7,则只能有一种情况,每一份都为1);
若n<k,则0种情况(不够分)。

代码如下:

int partition(int n, int k,int start) {
	if (k == 1) {
		return (n > 0) ? 1 : 0;
	}
	else if (n == k) {
		return 1;
	}
	else if (n < k) {
		return 0;
	}
	else {
		int count = 0;
		for (int i = start; i <= n /k; ++i) {
			count += partition(n - i, k - 1,i);    
                            //(剩余数字,可以分成k-1份,确保后面份数的数值大于等于前面)
		}
		return count;
	}
}

int main() {
	int n, k;
	cin >> n >> k;
	cout << partition(n, k,1) << endl;
	return 0;
}

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值