拆分自然数BFS

任何一个大于1的自然数n(n <= 10),总可以拆分成若干个小于n的自然数之和。

当n=7共14种拆分方法:

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7=1+1+1+1+3

7=1+1+1+2+2

7=1+1+1+4

7=1+1+2+3

7=1+1+5

7=1+2+2+2

7=1+2+4

7=1+3+3

7=1+6

7=2+2+3

7=2+5

7=3+4

输入

输入自然数n

输出

输出拆分的方案。

样例输入 Copy

7

样例输出 Copy

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

思路:dfs的变形。注意点有:1.不需要有bool类型的vis状态数组标记,观察到样例中的数组有重复项,所以不需要状态数组;2.dfs带入的参数有两个,大多数dfs的参数只有层数一个变量,但此题的变量有两个,分别为n和s,每次递归dfs(n-i,s+1),同时巧妙地找到终止条件,即s==0;3.样例中没有拆分成单独一个数,即不变的情况,因此要把此情况筛除。下面附上我的代码:

  1. #include <bits/stdc++.h>  
  2. #include <iostream>  
  3. using namespace std;  
  4. int n;  
  5. const int N=15;  
  6. int a[N];  
  7. bool vis[N];  
  8. void dfs(int n,int s){  
  9.     if(n==0){  
  10.         if(s<=2)return;  
  11.         for(int i=1;i<s-1;i++)  
  12.         cout<<a[i]<<"+";  
  13.         cout<<a[s-1]<<endl;  
  14.         return ;  
  15.     }  
  16.     for(int i=1;i<=n;i++){  
  17.         if(i<a[s-1])continue;  
  18.         a[s]=i;  
  19.         dfs(n-i,s+1);  
  20.     }  
  21. }  
  22. int main()  
  23. {  
  24.     cin>>n;  
  25.     dfs(n,1);  
  26.     return 0;  
  27. }  
posted @   SaulGoodman1  阅读(74)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示