首页 > 其他分享 >搜索与回溯 自然数的拆分

搜索与回溯 自然数的拆分

时间:2023-02-07 12:31:29浏览次数:64  
标签:27 cout int 57 自然数 37 拆分 回溯


【例5.3】自然数的拆分

时间限制: 1000 ms        内存限制: 65536 KB
提交数: 687     通过数:427 

【题目描述】

任何一个大于1的自然数n,总可以拆分成若干个小于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

total=14

【输入】

输入n。

【输出】

按字典序输出具体的方案。

【输入样例】

7

【输出样例】

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

【来源】

​No​

算法分析:

分出来的组合特点:

1.    sum=n

2.    每一组数个数不一定

3.    每一组后面的数必定大于等于前一个数,一是能避免等式重复,二是可以减少不必要的搜索

设计算法需要注意两点:

1.    设一数组a记录每一步所取数

2.    递归实现,每一条路口的值不变

具体细节在代码中。

代码实现:

#include<bits/stdc++.h>
using namespace std;
int n,total=0;
int a[10001]={1};
int print(int);
int search(int s,int t);//回溯算法
int main()
{
cin>>n;
search(n,1); //将要拆分的数n传递给s
cout<<total<<endl; //这是总方案数
return 0;
}
int search(int s,int t)
{
int i;
for(i=a[t-1];i<=s;i++)
if(i<n) //当前数i要大于等于前1位数,且不过n
{
a[t]=i; //保存当前拆分的数i
s-=i; //s减去i,s的值继续拆分
if(s==0) print(t); //s==0 拆分结束输出结果
else search(s,t+1); //s>0,继续递归
s+=i; //回溯:加上拆分的数,以便产分所有可能的拆分
}
return 0;
}
int print(int t)
{
total++;
cout<<n<<"=";
for(int i=1;i<=t;i++)
{
if(i==t)
{
cout<<a[i];
cout<<endl;
}
else cout<<a[i]<<"+";
}
}



标签:27,cout,int,57,自然数,37,拆分,回溯
From: https://blog.51cto.com/u_14932227/6041989

相关文章

  • 搜素与回溯 素数环:
    素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。书上算法分析:【算法分析】非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:......
  • Python模块之 urlparse 拆分 url 网址链接
    作用:拆解url网址链接,协议、网络位置、路径等必要操作:py2:>>>pipinstallurllib-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com>>>fro......
  • java 深度优先搜索(回溯法)
    深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-FirstSearch)。相应地,......
  • 由Java正则表达式的灾难性回溯引发的高CPU异常:java.util.regex.Pattern$Loop.match
    问题与分析某天领导report了一个问题:线上的CPU自从上一个版本迭代后就一直处于居高不下的状况,领导看着这段时间的曲线图判断是有两条线程在不停的死循环。接到任务后去查看......
  • x64 APP栈回溯原理
    [原创]关于X64程序中RUNTIME_FUNCTION,UNWIND_INFO,UNWIND_CODE结构理解  2021-2-319:27  4012X64程序会生成一个Pdata段,用于记录每个函数的栈帧和异常信息,......
  • 回溯法学习笔记
    回溯法学习笔记目录回溯法学习笔记1,什么是回溯法2,什么时候使用回溯法3,回溯法的套路4,例题1,什么是回溯法回溯法其实是一种使用递归的暴力搜索法2,什么时候使用回溯法在常......
  • 如何合并与拆分 Word 表格中的单元格
    在编辑Word文档时插入表格是非常实用的功能。有时,合并或者拆分某些单元格能帮助我们更好的显示或者编辑表格数据。在这里我将分享如何通过编程的方法完成此项操作。具体操作......
  • 如何合并与拆分 Word 表格中的单元格
    在编辑Word文档时插入表格是非常实用的功能。有时,合并或者拆分某些单元格能帮助我们更好的显示或者编辑表格数据。在这里我将分享如何通过编程的方法完成此项操作。具体操......
  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......
  • 刷刷刷 Day 30 | 回溯总结
    [回溯总结]回溯是递归的副产品,有递归就会有回溯;回溯法经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多......