回溯3--数的拆分

回溯3--数的拆分

一、心得

二、题目及分析

任意一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求总的拆分方法。

这个题目里面原数据数组和标记数组都没有,只有结果数组。

//t是轮数也是ans的位数,print里面输出的时候t要减1,因为判断的时候是在下一轮判断的

三、代码及结果

 1 /*
 2 任意一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求总的拆分方法。
 3
 4 这个题目里面原数据数组和标记数组都没有,只有结果数组。
 5
 6
 7 */
 8 #include <iostream>
 9 using namespace std;
10
11
12 int ans[10001]={1};//储存结果数组
13 int total=0;//方案总数
14 int n;
15
16 void print(int t){
17     total++;
18     cout<<"<"<<total<<">"<<": ";
19     cout<<n<<"=";
20     for(int i=1;i<t;i++){
21         cout<<ans[i]<<"+";
22     }
23     cout<<ans[t];
24     cout<<endl;
25 }
26
27 //t是轮数也是ans的位数,print里面输出的时候t要减1,因为判断的时候是在下一轮判断的  
28 void search(int s,int t){//t是轮数
29     if(s==0) print(t-1);
30     for(int i=ans[t-1];i<=s;i++){
31         if(i<n){//这句话限制7=7的情况
32             ans[t]=i;
33             search(s-i,t+1);
34             //上一步s-i,s的值没有改变,这一步不用回溯
35         }
36     }
37 }
38
39 int main(){
40     cin>>n;
41     search(n,1);
42     cout<<total<<endl;
43     return 0;
44 } 

时间: 2024-10-14 02:54:47

回溯3--数的拆分的相关文章

数的拆分x有一布判重特别重要!

qwqx 突然想起要打上题目 任何一个大于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 //AC自动机x#include<iostream>#include<cstdio

XidianOJ 1096 数的拆分

题目描述 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复. 输入 多组数据.每组只有一个整数n,表示待拆分的自然数n. n<=80 输出 每组一个数,即所有方案数. --正文 OJ1183的小数据版 直接算就好 #include <cstdio> #include <algorithm> #include <iostream> using namespace std; #define MOD 1000000007 typedef long

[hdu5312]数的拆分,数学推导

题意:给定一个序列,a[n]=3n(n-1)+1,n>=1,求给定的m(m<=1e9)最少可以用几个a里面的数表示(可以重复) 思路:对答案分类 (1)假定答案为1,则m必定是a中的某一个数,直接查找即可,复杂度O(logn) (2)假定答案为2,则m必定可以拆分成两个a中的数之和,用两指针分别从头和尾向中间扫,判断是否可以构成m,复杂度O(n) (3)假定答案大于等于3,设答案为k,即k>=3,则必有m=a[i1]+a[i2]+...+a[ik],由于a[i]=3i(i-1)+1=6[

数的拆分

题目:输入整数n,输出n的拆分方案,即n=S1+S2+S3+S4+S5......+Sk,且Sn<=S(n+abs(i))啊,按字典序输出. 数据输入: 一行一个整数n,1<=n<=20 数据输出: 所有拆分方案(见样例) 输入: 4 输出: 1+1+1+1 1+1+2 1+3 2+2 4 total=5 题解: 五的拆分如下 1+1+1+1+1 1+1+1+2 1+2+2 1+4 5 可以发现有 "___"的部分是4的拆分 可以枚举一个i,拆分i和n-i,完成搜索,

搜索入门练习题4 数的拆分 题解

题目描述 任何一个大于 \(1\) 的自然数 \(n\) ,总可以拆分成若干个小于 \(n\) 的自然数之和.当 \(n = 4\) 时,总共有 \(4\) 种拆分方法: \(4=1+1+1+1\) \(4=1+1+2\) \(4=1+3\) \(4=2+2\) 现在给你一个数 \(n(1 \le n \le 20)\) ,请按顺序输出 \(n\) 的所有拆分方案. 输入格式 输入包含一个整数 \(n(1 \le n \le 20)\) . 输出格式 输出 \(n\) 的所有拆分方案,每种方案占

NYOJ 541-最强DE 战斗力【大数,数的拆分问题】

最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业.但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争. 显然,面对多个国家的部队去作战,赵国的兵力明显处于劣势.战斗力是决定战争成败的关键因素,一般来说,一支部队的战斗力与部队的兵力成正比.但当把一支部队分成若干个作战队伍时,这个部队的战斗力就会大大的增强. 一支部队的战斗力是可以通过以下两个规则计算出来的: 1.若一支作战队伍的兵力为N,则这

Linux split拆分文件

200 ? "200px" : this.width)!important;} --> 介绍 split可以将一个大文件拆分成指定大小的多个文件,并且拆分速度非常的快,拆分一个1G大小的文件花费不到1S的时间,如果手工在windows上面进行操作估计得卡死. 选项 Usage: split [OPTION]... [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; defau

拆分大文件的脚本

有时候需要把一个大文件拆分成几个小文件,由于生产系统上没有split程序,因此自己写了两个脚本来实现该功能. 第一个脚本根据行数来拆分: #! /bin/bash #filename my-line-split.sh #usage: my-line-split.sh 行数 bigfile #拆分的文件以bigfile.split.1 bigfile.split.2...命名 split_line=$1 file=$2 total_line=$(wc -l <$file) prefix=$file

oracle利用正则表达式对字符串进行拆分

常规字符拆分方式 select REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) STR from (select '11,12,13,14,15,16' str from dual) CONNECT BY LEVEL <= REGEXP_COUNT(str, '[^,]+'); 使用特数字符拆分: oracle文本中的换行符.回车符.制表符 制表符 chr(9) 换行符 chr(10) 回车符 chr(13) 换行符拆分示例: with data_change as

VC++ 窗口拆分CSplitterWnd

前言         当前许多优秀的软件都采用"多视"技术. 所谓"多视",是指在同一个框架窗口里同时显示多个视图. 通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面更加友好,增强软件的可操作性. 拆分类型 MFC支持两种类型的拆分窗口:静态的和动态的. 静态拆分窗口:行列数在拆分窗口被创建时就设置好了,用户不能更改,但是用户可以缩放各行各列.一个静态拆分窗口最多可以包含16行16列.要找一个使用了静态拆分窗口的应用程序,只要看一下