递归练习 数的划分

题目来源:牛客网

数的划分
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述

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

输入:

n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 )

输出:

一个整数,即不同的分法。

输入描述:

两个整数 n,k ( 6 < n ≤ 200, 2 ≤ k ≤ 6 )

输出描述:

1个整数,即不同的分法。

AC代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
const int MAXN = 1e7;
int n, k, cnt;
// st为上一个位置的数字,要保证非降序排列才能不重不漏
// sum代表各个位的数字和,用来判断
// u从1开始 
void dfs(int u, int st, int sum) {
	if(u > k) {
		if(sum == n) {
			cnt++;
		}
		return;
	}
	// for循环剪枝优化 
	// 如果剩下的位数 * 最小的数 + sum > n 则需要剪枝 
	for(int i = st; i * (k - u + 1) + sum <= n; i++) {
		dfs(u + 1, i, sum + i);
	}
}
int main() {
	cin >> n >> k;
	dfs(1, 1, 0);
	cout << cnt << endl;
	return 0;
}

剪枝情况讲解:如果当前情况为:2 _ _ _ ,则第二位得从2开始选,假设后三位都选 2 ,总和 sum > n,那这种情况就得跳出了。所以剪枝,避免浪费时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归是一种思维方式,通过函数自身调用来解决问题。归的基本原理是将一个大问题划分为相同但规模较小的子问题,直到子问题可以直接解决。归的进阶练习题可以帮助我们更深入地理解归的应用。 举个例子,我们来看一个归进阶练习题:求斐波那契数列的第n项。斐波那契数列的规律是前两个数都是1,从第三个数开始,每个数都是前两个数之和。 使用归可以很方便地解决这个问题。我们可以定义一个函数fibonacci(n),输入一个整数n,返回斐波那契数列的第n项。 首先,我们需要考虑归的终止条件。当n的值是1或2时,直接返回1,因为斐波那契数列的前两个数都是1。 当n大于2时,我们需要调用fibonacci(n-1)和fibonacci(n-2)来计算前两项的和。具体操作如下: 1. 若n等于1或2,返回1; 2. 否则,返回fibonacci(n-1) + fibonacci(n-2)。 下面是一个具体的实现示例: ```python def fibonacci(n): if n == 1 or n == 2: return 1 else: return fibonacci(n-1) + fibonacci(n-2) n = 6 result = fibonacci(n) print("斐波那契数列的第{}项是:{}".format(n, result)) ``` 输出结果为: ``` 斐波那契数列的第6项是:8 ``` 通过归调用,我们可以方便地求解斐波那契数列的第n项。这个例子展示了归的思维方式和应用。不过需要注意的是,在使用归时要注意终止条件的设定,否则可能会导致无限归的情况发生。在实际应用中,我们也可以考虑使用迭代等方法来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值