拆分自然数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.样例中没有拆分成单独一个数,即不变的情况,因此要把此情况筛除。下面附上我的代码:
- #include <bits/stdc++.h>
- #include <iostream>
- using namespace std;
- int n;
- const int N=15;
- int a[N];
- bool vis[N];
- void dfs(int n,int s){
- if(n==0){
- if(s<=2)return;
- for(int i=1;i<s-1;i++)
- cout<<a[i]<<"+";
- cout<<a[s-1]<<endl;
- return ;
- }
- for(int i=1;i<=n;i++){
- if(i<a[s-1])continue;
- a[s]=i;
- dfs(n-i,s+1);
- }
- }
- int main()
- {
- cin>>n;
- dfs(n,1);
- return 0;
- }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现