首页 > 其他分享 >拆分自然数BFS

拆分自然数BFS

时间:2022-12-24 19:11:56浏览次数:39  
标签:数组 int 自然数 样例 dfs 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. }  

标签:数组,int,自然数,样例,dfs,BFS,拆分
From: https://www.cnblogs.com/saulgoodman1/p/17003220.html

相关文章

  • 1350年,法国学者证明的自然数倒数和为发散的原理
    ......
  • 服务拆分及远程调用
             ......
  • 利用SQL Server XML拆分数据
    DECLARE@strIDVARCHAR(200)='1,2,3';DECLARE@xmlXML;SELECT@xml=CONVERT(XML,'<root><place><id>'+REPLACE(@strID,',','</id></place><place><id>')+'</id......
  • POJ 3278 Catch That Cow(BFS)
    POJ3278CatchThatCow​ 现在你在一个数轴上的位置x,位置k上有一头牛,你要抓住这头牛,也就是走到位置k上。那怎么走呢?你有两种走路的方法,一种是从x移动到\(2\tim......
  • P1379 八数码难题(BFS)
    P1379八数码难题​ 八数码问题就是在\(3\times3\)的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,我们用0来表示。给出一个初始局面,给......
  • BFS,DFS算法
    算法题目  基础:1.数组2.字符串3.排序4.贪心5.递归6.循环7.滑窗8.栈9.进制转换10.位运算11.队列12.哈希表13.链表14.线性表15.二分查找......
  • 34-Ansible常用playbook和大型项目role角色拆分
    yaml简单示例#格式要求在单一文件第一行,用连续三个连字号"-"开始,还有选择性的连续三个点号(...)用来表示文件的结尾次行开始正常写Playbook的内容,一般建议写明该......
  • 如何在Word表格中拆分或合并单元格?
    我们在使用Word制作表格时,由于表格较为复杂,只是简单的插入行、列并不能满足我们的需要。要做一个完整的表格,很多时候需要将单元格进行拆分或者合并,才能达到我们想要的效果......
  • P2404 自然数的拆分问题
    #include<iostream>#include<algorithm>usingnamespacestd;constintN=10;intn;intpath[N];voiddfs(intsum,intstart,intk){if(sum==n)......
  • DDD与云原生时代的微服务拆分
    目录​​一、概念​​​​DDD​​​​云原生​​​​微服务​​​​二、微服务与云原生​​​​三、DDD与微服务​​​​四、微服务拆分步骤​​​​小结​​在服务拆分的时......