【问题描述】
美羊羊给喜羊羊和沸羊羊出了一道难题,说谁能先做出来,我就奖励给他我自己做的一样礼物(聪羊羊插嘴:无聊!!!)。沸羊羊这下可乐了,于是马上答应立刻做出来,喜羊羊见状,当然也不甘示弱,向沸羊羊发起了挑战(聪羊羊插嘴:一切为了美羊羊啊……一丁点儿奖励你们还挑战啊??)。
可是这道题目有一些难度(聪羊羊插嘴:你当美羊羊的礼物那么好拿啊?),喜羊羊做了一会儿,见沸羊羊也十分头疼,于是就来请教了你。题目是这样的:
把自然数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;
}
希望能帮助到各位同志,祝天天开心,学业进步!