数的拆分

题目:输入整数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,完成搜索,定义数组num表示拆分出来的数,定义变量surplus表示剩余的值(num[idx-1]<=i<=surplus)

完整代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int num[21];
int n,ans;
void print(int x)//输出函数
{
        ans++;//总数加一
        for(int i=1;i<=x-1;i++) printf("%d+",num[i]);
        printf("%d\n",num[x]);
}
void dfs(int idx,int surplus)
{
    if(surplus==0)//当剩余值为0时,输出
    {
        if(idx>1) print(idx-1);
    }
    else for(int i=num[idx-1];i<=surplus;i++)//否则枚举i
    {
        num[idx]=i;//赋值
        dfs(idx+1,surplus-i);//深搜
    }
}
int main()
{
    int n;
    scanf("%d",&n);//读入
    num[0]=1;
    dfs(1,n);
    printf("total=%d",ans);//输出总数
    return 0;
}

  

原文地址:https://www.cnblogs.com/chen-1/p/9463784.html

时间: 2024-11-08 23:04:01

数的拆分的相关文章

XidianOJ 1096 数的拆分

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

数的拆分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

[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[

搜索入门练习题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列.要找一个使用了静态拆分窗口的应用程序,只要看一下