自然数无序拆分---递归搜索

【问题描述】

美羊羊给喜羊羊和沸羊羊出了一道难题,说谁能先做出来,我就奖励给他我自己做的一样礼物(聪羊羊插嘴:无聊!!!)。沸羊羊这下可乐了,于是马上答应立刻做出来,喜羊羊见状,当然也不甘示弱,向沸羊羊发起了挑战(聪羊羊插嘴:一切为了美羊羊啊……一丁点儿奖励你们还挑战啊??)。

可是这道题目有一些难度(聪羊羊插嘴:你当美羊羊的礼物那么好拿啊?),喜羊羊做了一会儿,见沸羊羊也十分头疼,于是就来请教了你。题目是这样的:

把自然数N(N<=100)分解为若干个自然数之和,求出有几种情况。如 N=5时,有7种情况

5=1+1+1+1+1

5=1+1+1+2

5=1+1+3

5=1+2+2

5=1+4

5=2+3

5=5

怎么样?你要加油帮助喜羊羊哦!

【输入数据】

一个自然数N(N<=100)

【输出数据】

无序拆分的种数。

【输入输出样例】

binary.in

5

binary.out

7

输入样例:

5

输出样例:

7

这题的解空间树是一颗n叉树,下面是我画的部分分支,比较抽象,大家凑合着看一下哈哈哈

 代码如下:

#include <bits/stdc++.h>
using namespace std;

int n;//自然数
int result[105];//存放结果集
int sum=0;//自然数之和 
int cnt=0;//记录种数 
void dfs(int k)
{
	if(sum==n)
	{
		//输出结果集: 
//		cout<<n<<"=";
//		for(int i=1;i<k-1;i++)
//			cout<<result[i]<<"+";
//		cout<<result[k-1]<<endl;
		cnt++;
		return ;
	}
	
	for(int i=1;i<=n-sum;i++)//确保自然数字和不超过n(剪枝) 
	{
		//确保拆分的这个自然数 >= 上一个 (约束函数) 
		if(i>=result[k-1])
		{
			result[k]=i;
			sum=sum+i;
			k++; //递归搜素下一层 
			dfs(k);
			k--;//回溯 
			sum=sum-i;
			result[k]=0; 
		}
	}
} 
int main() 
{
    cin>>n;
    dfs(1);
    cout<<cnt<<endl; 
    return 0;
}

 希望能帮助到各位同志,祝天天开心,学业进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值