【例】数字6可分解为

6

5+1

4+2        4+1+1

3+3        3+2+1         3+1+1+1

2+2+2    2+2+1+1    2+1+1+1+1

1+1+1+1+1+1

思路:回溯算法,搜索所有情况,只保留符合条件的

递归终止条件:临时数组求和等于n则加入结果集,同时结束递归

递归过程:循环遍历1..n,将新数字加入临时数组中进入下一层递归,出来后再将其移除

回溯的关键在于,添加和移除,保证所有可能性都被遍历到,整体结构和栈类似

代码

# 结果集(解空间),全局变量保存最终结果
result_set = []def foo(n, result=None):"""n为要分解的数字的2倍,result为临时结果"""if result is None:result = []# 当n正好与result中元素求和相等时把result作为一种解,添加到解空间result_set中if n == sum(result):global result_set# 对result进行排序是为了方便判断解空间result_set中是否包含resultsorted_result = sorted(result[:], reverse=True)# 只有在结果集中不含result才将其加入解空间,确保每个结果的唯一性if sorted_result not in result_set:result_set.append(sorted_result)else:# 从1..n把所有数字相加的所有情况列出来for i in range(1, n):# 为了提高效率,# 对于(result + i) > (n - i)时直接回溯,因为继续执行result只会递增,不再可能等于nif sum(result) + i > n - i:breakresult.append(i)foo(n - i, result)result.pop()def combination_sum(n):foo(2 * n)return result_setif __name__ == '__main__':res = sorted(combination_sum(6))print(res)# 打印结果:[[1, 1, 1, 1, 1, 1], [2, 1, 1, 1, 1], [2, 2, 1, 1], [2, 2, 2], [3, 1, 1, 1], [3, 2, 1], [3, 3], [4, 1, 1], [4, 2], [5, 1], [6]]# 为了方便验证结果,将结果格式化输出res_size = len(res)for i in range(res_size - 1, -1, -1):if i + 1 < res_size and int(res[i][0]) != int(res[i + 1][0]):print('')res[i] = list(map(lambda x: str(x), res[i]))print('+'.join(res[i]), end=' ')# 打印结果:# 6# 5+1# 4+2 4+1+1# 3+3 3+2+1 3+1+1+1# 2+2+2 2+2+1+1 2+1+1+1+1# 1+1+1+1+1+1

【算法设计与分析】将数字分解为n个数字之和相关推荐

  1. 算法设计与分析之数字三角形问题(C++解法)

    算法设计与分析之数字三角形问题 前言 问题描述 确定数据存储方式 确定分析方法 编码 顺推法 逆推法 前言 此文章完成数字三角形问题的简便算法,如果文中有错请给予反馈,刘某不胜感激 问题描述 确定数据 ...

  2. 计算机算法设计与分析——数字三角形问题

    计算机算法设计与分析(算法实现题3) 3-4 数字三角形问题 问题描述: 给定一个由n行数字组成的数字三角形.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计: ...

  3. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  4. 算法设计与分析之分治法

    文章目录 前言 一.分治法设计思想 二.分治法与递归 三.分治法的适用条件 四.时间复杂度分析 五.分治法设计步骤 六.分治法示例 总结 前言 大家好,我是一只勤勤恳恳的程序猿.本篇文章小猿将跟您分享 ...

  5. 2020-2021中科院陈玉福算法设计与分析期末考试

    2020-2021中科院陈玉福算法设计与分析期末考试 中科院沈阳计算所 时文康 于2020.12.31 一.(20 分)简答题 1,陈述算法在最坏时间下的时间复杂度和平均时间复杂度:这两种评估算法复杂 ...

  6. 哈工大2020秋算法设计与分析大作业(一)

    哈工大2020秋算法设计与分析大作业(一) 前言 正文 1 论文题目 标题 作者 刊物 2 论文阅读报告 2.1 摘要 2.2 问题定义 2.3 算法或证明过程 2.4 实验结论 哈工大2020秋算法 ...

  7. 算法设计与分析——算法思想总结

    算法设计与分析 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解 ...

  8. 哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析

    点击上方蓝字,关注公众号 目录 1. The Gist 1.1 为什么要学它(Motivation) 1.2 High level idea 1.3 4个例子 2. Big-Oh Notation 2 ...

  9. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  10. C++算法设计与分析课后习题(第三章)

    C++算法设计与分析课后习题[第三章] 前言 一.求2+22+222+2222+...+22...(n个2)...22(精确计算) 变量解释 运行截图 二.编写一个算法,其功能是给一维数组a输入任意6 ...

最新文章

  1. 前景背景分割——ostu算法的原理及实现 OpenCV (八)
  2. python共享内存
  3. python处理excel表格数据-零基础使用Python读写处理Excel表格的方法
  4. 写文件 —— 将内容按照指定格式写入配置文件(fwrite()函数-》》向指定的文件中写入若干数据块)
  5. 超图iServer发布一个示例3D场景
  6. linux declare大小写,关于linux:将用户输入转换为大写
  7. boost::mp11::mp_take相关用法的测试程序
  8. 05-传统开发模式DAO
  9. Freemarker宏和函数的用法和区别
  10. 一加8/一加8 Pro外形配置全曝光:就差个价格了
  11. 汇编取值运算符OFFSET,SEG,LEA和属性运算符PTR
  12. Android通过泛型简化findViewById类型转换
  13. AI模型的大一统!多模态领域乱杀的十二边形战士
  14. 小霸王电脑吃鸡/玩大型游戏GlobalShaderCache-PCD3D_SM4.bin is missing解决方法
  15. SpringBoot单元测试保姆级教程,文末介绍Postman的基本使用
  16. 大岩量化小白科普:什么是量化交易?什么是宽客?
  17. ubantu 常用命令
  18. 2014校园招聘之一(8月华为机试题)
  19. ept技术_每天5分钟跟我一起学电气之EPT的原理
  20. GoLang 抽奖系统 设计

热门文章

  1. 第一篇:爬虫基本原理
  2. vue-time-slot 一款基于vue3的会议预约时间组件,时间轴为早7-晚11,可自由选择,并且非常方便。
  3. java去除数组重复元素的四种方法
  4. 【笔记】操作系统(六)——进程同步
  5. 微信小程序多点定位marker标点polyline连线
  6. matlab java堆内存溢出,matlab内存溢出的解决方案
  7. 没迈过PRA的门槛 企业谈何“人工智能”
  8. 接近8000字的Spring/SpringBoot常用注解总结!安排!
  9. 一款极简聊天应用,比较完整,略好看
  10. 【每日新闻】IDC:国产手机品牌在印度拿下66%的市场份额