将一个正整数n拆分成若干个正整数的和(至少两个数,n<=100)。

输入格式:

一个正整数n

输出格式:

若干行,每行一个等式(数与数之间要求非降序排列)。最后一行给出解的总个数

输入样例:

在这里给出一组输入。例如:

4
 

输出样例:

4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
4
 

最后一行的4表示总共有4个解。

主要思路: 使用深度优先搜索算法。从n开始,每次枚举所有可能的加数,如果加数满足要求,则将其加入到组成部分中,继续递归处理剩余部分,直到剩余部分被成功分解或者不满足要求,然后回溯,撤销当前加数的选择,尝试下一个加数。这样就能够穷举所有可能的分解方案。 使用递归函数dfs()实现深度优先搜索。dfs()函数有三个参数:cur表示当前需要分解的数,sum表示已经分解的数之和,last表示上一个加数。当cur为0且sum为n时,找到了一个分解方案,将其输出;否则,枚举所有可能的加数,并对剩余部分进行递归处理。 在dfs()函数中使用数组nums[]存储每个组成部分的数值,使用变量size记录当前组成部分的数量。在递归处理剩余部分时,需要将当前加数加入组成部分,并递归处理剩余部分,成功分解后回溯,撤销当前加数的选择。这里使用回溯法可以避免重复计算。

// 原作者箱庭,请勿转载

#include <stdio.h>

int n;          // 待分解的数
int nums[100]; // 存储每个组成部分的数值
int size; // 当前组成部分的数量
int cnt; // 分解方案的数量 // 深度优先搜索函数,cur为当前需要分解的数,sum为已分解的数之和,last为上一个加数
void dfs(int cur, int sum, int last) {
// 如果已经成功分解出所有数且总和为n,则找到了一个分解方案
if (cur == 0 && sum == n) {
cnt++; // 记录分解方案的数量
// 输出分解方案
printf("%d=%d", n, nums[0]);
for (int i = 1; i < size; i++) {
printf("+%d", nums[i]);
}
printf("\n");
} else {
// 枚举所有可能的加数
for (int i = 1; i <= cur; i++) {
// 确保加数不小于上一个加数,总和不超过n,并且不能仅剩一个数未加入
if (i >= last && sum + i <= n && i<n ) {
nums[size] = i; // 将当前加数存入组成部分
size++; // 组成部分数量加1
dfs(cur - i, sum + i, i); // 继续分解剩余部分
size--; // 回溯,撤销当前加数的选择
}
}
}
}
//原作者箱庭,请勿转载


int main() {
scanf("%d", &n); // 输入待分解的数
nums[0] = 0; // 初始化组成部分,第一个数为0
size = 0; // 初始化组成部分数量
dfs(n , 0, 1); // 开始分解
printf("%d", cnt); // 输出分解方案数量
return 0;
}

【c语言】整数拆分的更多相关文章

  1. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  2. LightOJ 1336 Sigma Function(数论 整数拆分推论)

    --->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. ...

  3. LightOJ 1341 Aladdin and the Flying Carpet(整数拆分定理)

    分析:题目并不难理解,就是一些细节上的优化需要我们注意,我在没有优化前跑了2000多MS,优化了一些细节后就是400多MS了,之前还TLE了好几次. 方法:将整数拆分为质因子以后,表达为这样的形式,e ...

  4. HDU1028 (整数拆分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. 整数拆分问题_C++

    一.问题背景  整数拆分,指把一个整数分解成若干个整数的和 如 3=2+1=1+1+1  共2种拆分 我们认为2+1与1+2为同一种拆分 二.定义 在整数n的拆分中,最大的拆分数为m,我们记它的方案数 ...

  6. Pollard-Rho大整数拆分模板

    随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC ...

  7. poj3181【完全背包+整数拆分】

    题意: 给你一个数n,在给你一个数K,问你这个n用1-k的数去组合,有多少种组合方式. 思路: 背包重量就是n: 那么可以看出 1-k就是重物,价值是数值,重量是数值. 每个重物可以无限取,问题转化为 ...

  8. HDU 1028 Ignatius and the Princess III(母函数整数拆分)

    链接:传送门 题意:一个数n有多少种拆分方法 思路:典型母函数在整数拆分上的应用 /********************************************************** ...

  9. LeetCode 343. 整数拆分(Integer Break) 25

    343. 整数拆分 343. Integer Break 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 每日一算法2019/5/2 ...

  10. LeetCode 343.整数拆分 - JavaScript

    题目描述:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 题目分析 题目中"n 至少可以拆分为两个正整数的和",这个条件说 ...

随机推荐

  1. IntelliJ IDEA 生成serialVersionUID

    1.设置Settings-->Editor->Inspections 2.实现Serializble

  2. 配置RMAN(缩减版)

    配置备份的默认类型:备份集或副本 要配置默认备份类型: 启动 RMAN 并连接到目标数据库和恢复目录(如果使用). 将备份集或映像副本配置为默认备份类型. 以下示例配置磁盘备份到副本和备份集的备份类型 ...

  3. spider_requests库简单ip代理

    """使用requests 设置ip代理"""import requestsdef func(): url = 'http://ip.273 ...

  4. calibredrv 对layer做操作

    #clip.tclset L [layout create xxx.gds] $L create layer 10.0 $L create polygon 10.0 10 1000 1000 2000 ...

  5. 训练题——DS18B20部分

    Author:Cherry_Ywj 0. 前言 本文档以 DS18B20 为例,主要介绍如何针对一种传感器编写相应的驱动库,驱动是单片机开发中难度较大的一环.从看别人代码并对照 datasheet 开 ...

  6. 高性能的StampedLock锁

    StampedLock 支持的三种锁模式: 1.ReadWriteLock 支持两种模式:一种是读锁,一种是写锁 2.StampedLock 支持三种模式,分别是:写锁.悲观读锁和乐观读 1)写锁.悲 ...

  7. Arduino开发ESP8266——安装与配置ESP8266开发板

    一.安装Arduino 1.下载安装包:点击打开 2.安装:直接点击下一步直至安装完成.如下图所示: 二.下载ESP8266开发板库: 在这面填写ESP8266开发板地址:http://arduino ...

  8. SQL之查询

    1. SQL之模糊查询 例如查询姓名时,不用输入全名,仅仅输入其中的一部分 语法: select 列名 from 表名 where 列名 like 匹配串 其中 匹配串用英文的单引号括起来 四种匹配模 ...

  9. homework2软件方法论

    什么是软件工程方法论? 1.软件工程是一个方法论,就是我们在开始一个项目时,大体框架一定要有这么一个概念,而具体实施时,必须根据公司一些特点,优化项目开发的流程,这样才是有实效而方法论只是软件工程的结 ...

  10. binlog2sql 实战心得

    原创:binlog2sql在GitHub的地址:https://github.com/danfengcao/binlog2sql 作者:danfengcao 功能:从MySQL binlog解析出你要 ...