python 回溯法 子集树模板 系列 —— 4、数字组合问题
问题
找出从自然数1、2、3、...、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
分析
换个角度,r=3的所有组合,相当于元素个数为3的所有子集。因此,在遍历子集树的时候,对元素个数不为3的子树剪枝即可。
注意,这里不妨使用固定长度的解。
直接套用子集树模板。
代码
'''数字组合问题'''n = 5
r = 3
a = [1,2,3,4,5] # 五个数字x = [0]*n # 一个解(n元0,1数组) 固定长度
X = [] # 一组解def conflict(k):global n, r, xif sum(x[:k+1]) > r: # 部分解的长度超出rreturn Trueif sum(x[:k+1]) + (n-k-1) < r: # 部分解的长度加上剩下长度不够rreturn Truereturn False # 无冲突# 套用子集树模板
def comb(k): # 到达第k个元素global n, x, Xif k >= n: # 超出最尾的元素#print(x)X.append(x[:]) # 保存(一个解)else:for i in [1, 0]: # 遍历元素 a[k] 的两种选择状态:1-选择,0-不选x[k] = iif not conflict(k): # 剪枝comb(k+1)# 根据一个解x,构造对应的一个组合
def get_a_comb(x):global areturn [y[0] for y in filter(lambda s:s[1]==1, zip(a, x))]# 根据一组解X,构造对应的一组组合
def get_all_combs(X):return [get_a_comb(x) for x in X]# 测试
comb(0)
print(X)
print(get_all_combs(X))
效果图
python 回溯法 子集树模板 系列 —— 4、数字组合问题相关推荐
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...
- python 回溯法 子集树模板 系列 —— 1、8 皇后问题
问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...
- python 回溯法 子集树模板 系列 —— 5、取物搭配问题
问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...
- python 回溯法 子集树模板
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足 ...
- python回溯算法全排列_python 回溯法 子集树模板 系列 —— 11、全排列
问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模板. 不过本文使用子集树模板.分析如下: 一个解x就是n个元素的一种排列,显然,解x的长度是固定 ...
- 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题
这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...
- python找零钱问题_Python基于回溯法子集树模板解决找零问题示例
本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...
- python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例
本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...
- python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...
最新文章
- 对一条常用命令(netstat结合awk统计TCP连接数)的理解
- win7中安装mysql_windows7下安装Mysql5.6数据库图文教程(压缩包安装)
- CSS Media媒体查询
- [最新答案V0.4版]微软等数据结构+算法面试100题[第41-60题答案]
- intellij出现Initial job has not accepted any resources;
- 导入功能 php,php Excel 导入功能
- 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
- 合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)
- bzoj3143: [Hnoi2013]游走
- python右对齐乘法表_python如何打印99乘法表
- 界面的创建(高仿QQ登入界面)
- 电动汽车动力系统整车仿真,具有双向DCDC变换器实现能量反馈,可带异步电机
- python怎么退出窗口_关闭pyplot窗口
- 【汇编作业记录Proteus8+keil5 作业 2】
- Arcgis API For js 的离线部署
- CAN笔记(17) 预定义报文ID
- 微信小程序连接mysql
- 【FinE】FamaFrench 5 Factors asset pricing Model(FF五因子模型)
- 【安全牛学习笔记】POP3
- 制造业从中国回流英国 英媒:工业史上的奇妙反转