拆数——搜索与回溯

题目描述 Description

求任何一个大于0的自然数n,总可以拆分成若干个小于n的自然数之和

输入输出格式 Input/output

输入格式:
一个正整数n
输出格式:
n=XXX+XXX+XXX+XXX…

total(总方案数)=XXX

输入输出样例 Sample input/output

样例测试点#1

输入样例:

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
total=14

思路:代码很清楚,此处无需讲~~

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstdlib>
 4 using namespace std;
 5 int a[10001]={1},n,total;
 6 int search(int,int);
 7 int print(int);
 8 int main()
 9 {
10     cin>>n;
11     search(n,1);
12          //将要拆分的数n传递给s
13     cout<<"total="<<total<<endl;
14          //输出拆分的方案数
15     return 0;
16 }
17 int search(int s,int t)
18 {
19     int i;
20     for (i=a[t-1];i<=s;i++)
21     if(i<n)//当前数i要大于等于前1位数,且不过n(如果刚好等于n的话,加数中必定有一个为0,不合法,get out!)
22     {
23        a[t]=i;//递增
24        //保存当前拆分的数i
25        s-=i;
26        //s减去数i, s的值将继续拆分
27        if (s==0) print(t);
28        //当s=0时,拆分结束输出结果
29          else search(s,t+1);
30        //当s>0时,继续递归
31        s+=i;
32        //回溯:加上拆分的数,以便产分所有可能的拆分
33     }
34 }
35 int print(int t)
36 {
37     cout<<n<<"=";
38     for (int i=1;i<=t-1;i++)
39     //输出一种拆分方案
40       cout<<a[i]<<"+";
41     cout<<a[t]<<endl;
42     total++;
43    //方案数累加1
44 }
时间: 2024-10-28 14:19:10

拆数——搜索与回溯的相关文章

一本通搜索与回溯例题5.2

[题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出所有组合. 例如n=5,r=3,所有组合为: 1 2 3   1 2 4   1 2 5   1 3 4   1 3 5   1 4 5   2 3 4   2 3 5   2 4 5   3 4 5 [输入] 一行两个自然数n.r(1<n<21,1≤r≤n). [输出] 所有的组合,每一个组合占一行且

递归,搜索,回溯,最优路径(线段)

基本信息 内存:520kB 时间:0ms 语言:G++ 题目链接http://bailian.openjudge.cn/practice/solution/4779752/ 解题报告: 1.输入表格时,由于这里有空格,不能用scanf函数. 2.gets(board[i]+1) 不要把第一列刷去. 3.回溯mark[y][x]=false;这里在Search玩后,一定要将mark[y][x]改为false.否则下一次的搜索将不会访问到这个点. 4.方向最好用数组形式表示. 5.最重要的一点是:这

搜索与回溯算法

[例]任何一个大于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 1 [参考程序] 2 program ex5_3; 3 var a:array[0..100]of integer

工作分配——搜索与回溯

题目描述 Description 设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下: 每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出 输入输出格式 Input/output 输入格式:无输出格式: A:J5 B:J3  …… total=XXX 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: A:J5B:J3  …… total=XXX 思路: 1.用数组f储存工作选

搜索与回溯 - 素数环

[题目描述] 从1到20,这20个数摆成一个环,要求相邻的两个数的和是一个素数.求所有可能. [算法分析&&参考代码] 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int a[21],ans=0; //a数组表示第几个位置的数是啥. 5 bool b[21]={0}; //b数组表示标记,这个数用过没有? 6 bool pd(int,int); 7 void dfs(int);

马的遍历——搜索与回溯

题目描述 Description 中国象棋半张棋盘如图所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳.比如图4(a)中所示为一种跳行路线,并将所经路线打印出来. 输入输出格式 Input/output 输入格式:无输出格式: 第一行:一个整数total表示第几种跳法 第二行:0,0-->2,1-->3,3-->1,4-->3,5-->2,7-->4,8 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 1 0,0

sicily 1152 简单马周游 深度优先搜索及回溯算法

1152. 简单的马周游问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 在一个5 * 6的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便于表示一个棋盘,我们按照从上到下,从左到右对棋盘的方格编号,如下所示: 1     2     3       4    

【刷题小记66】分拆数

[转载请注明出处]http://blog.csdn.net/mingyong_blog/article/details/39252363 描述 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y. 输入 第一行输入一个整数n,代表有n组测试数据. 接下来n行每行输入一个正整数k 输出 按顺序输出对应每行的k找到所有满足条件1/k=1/x+1/y的组合 思路分析 关键是怎么处理1/k=1/x+1/y,由于对除法不好处理,这个式子中有3个除法,所以转化成乘法的形式处理,转成成

素数环——搜索与回溯

题目描述 Description 从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. 输入输出格式 Input/output 输入格式:无输入输出格式:一个整数(第几号素数环),一列数字(表示这个素数环) 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 这里就不演示了(…) 思路:代码很清楚,此处无需讲~~ 代码如下: 1 #include <stdio.h> 2 #include <math.h> 3 int a[3