1.问题描述

 比如9个数中取4个数的组合以及列出各种组合,该如何做?

 我们可以考虑以下一个简单组合:从1,2,3,4,5,6中,如何选取任意四个数的组合。

 固定:1   2  3  ,组合有1234 1235 1236 

 固定1 2 4,组合有:1245 1246

 固定1 2 5,组合有:1256

固定1 3 4,组合有:1345 1346

 固定1 3 5,组合有:1356

 固定1 4 5,组合有:1456

 固定2 3 4,组合有:2345 2346

 固定2 3 5,组合有:2356

 固定2 4 5,组合有:2456

 固定3 4 5,组合有:3456

  共有15种组合

2.简单实现一下组合算法

  首先,我们分析上面列出的10个步骤,对于1),很明显,在固定了1 2 3这三个数之后,第四个数就是4、5、6三个数进行了循环(还记得循环吗,计算机最拿手的就是做循环)。其次,我们再分析1)2)3)这三个步骤中固定的数字,前两个没有变,都是1 2,只是第三个数在进行循环(又是循环)。

  通过分析,我们可以找到这样的规律:

    1    先固定3个数,让第四个数进行循环

    2    让第三个数循环,重复第一步

    3    让第二个数循环,重复第一步

    4    让第一个数循环,重复第一步

def combNumberLoop4(m, b):
totalNumber = 0
for i in range(1, m+2-4):
b[0] = i
for j in range(i+1, m+2-3):
b[1] = j
for k in range(j+1, m+2-2):
b[2] = k
for l in range(k+1, m+2-1):
b[3] = l
print b
totalNumber += 1
return totalNumber group=[99,99,99,99]
print "\nUsing Loop: %d\n" % combNumberLoop4(6, group)

  程序的输出结果,正如之前分析的那样。

3.如何递归解决组合问题

  我们再回到C(6,4)问题,除了上面列出的十个步骤,我们换个思路:

    如果在6个数中选定一个数,那么确定剩下的3个数是不是变为了“从5个数中选3个数的组合问题”了呢?以此类推,这似乎变成了一个“递归”问题了,确实,我们可以用递归的思路来解决这个问题。

    对于C(m, n)列出所有组合的问题,可以按照一下的步骤来进行编程,这次我们按从后往前的顺序来列出所有组合:

      1   选定一个元素i,在范围[m, n]内进行循环

      2   将i 作为所求组合的最后一个元素

      3   如果n-1>0,进行递归调用,求C(m-1, n-1);否则,输出结果

      4   重复①

    注意,设计递归函数一定要有终止条件,否则会造成“死循环”。

实现的代码如下:

def combNumber(m, n, b):
global totalNumberR
for i in range(m, n-1, -1):
b[n-1] = i
if n-1>0:
combNumber(i-1,n-1,b)
else:
print b
totalNumberR += 1
return totalNumberR group=[99,99,99,99,99]
totalNumberR = 0
print "\nUsing Recursive: %d\n" % combNumber(7,5,group) 

  递归的使用,让程序写起来非常的简洁,但是,在写程序的时候,我有两个地方(其实程序也就难在这两个地方),折腾了好几天才弄清楚:

     首先是for循环的循环范围如何确定;

     其次是递归调用时使用的参数设计;

3.python提供的内置组合函数

def combinations_with_replacement(iterable, r):
# combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
pool = tuple(iterable)
n = len(pool)
if not n and r:
return
indices = [0] * r
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != n - 1:
break
else:
return
indices[i:] = [indices[i] + 1] * (r - i)
yield tuple(pool[i] for i in indices)

4.更多组合算法

  请点击我:https://docs.python.org/3/library/itertools.html?highlight=combinations#itertools.combinations

  

python解决组合问题的更多相关文章

  1. C# 解决组合优化问题

    Google Optimization Tools介绍 Google Optimization Tools(OR-Tools)是一款专门快速而便携地解决组合优化问题的套件.它包含了: 约束编程求解器. ...

  2. python笔记-用python解决小学生数学题【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为 ...

  3. python的组合数据类型及其内置方法说明

    python中,数据结构是通过某种方式(例如对元素进行编号),组织在一起数据结构的集合. python常用的组合数据类型有:序列类型,集合类型和映射类型 在序列类型中,又可以分为列表和元组,字符串也属 ...

  4. 《用Python解决数据结构与算法问题》在线阅读

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  5. 有关科学计算方面的python解决

    在科学计算方面,一般觉得matlab是一个超强的东西.此外还有R. 至于某种语言来说,一般都要讲究一些特别的算法,包含但不限于: 矩阵方面的计算 指数计算 对数计算 多项式运算 各类方程求解 总之.仅 ...

  6. appium+python解决每次运行代码都提示安装Unlock以及AppiumSetting的问题

    appium+python解决每次运行代码都提示安装Unlock以及AppiumSetting的问题(部分安卓机型) 1.修改appium-android-driver\lib下的android-he ...

  7. 高德API+Python解决租房问题(.NET版)

    源码地址:https://github.com/liguobao/58HouseSearch 在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/ 周末闲着无事 ...

  8. Python的组合模式与责任链模式编程示例

    Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...

  9. python的组合数据

    python的组合数据包括:1.列表list[   ] 2.元组tuple(),3.字典dict{"x":"y"},4.集合set{} 1.创造组合数据:均可直 ...

随机推荐

  1. C++ 的getline问题

    在用c++的getline函数的时候碰到两个问题,总结如下: 1.有时候写程序的时候我们会发现getline(cin,str);这样的语句是不会执行,而是直接跳过的, 一般的解决方法是getline一 ...

  2. bzoj3524/2223 [Poi2014]Couriers

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 http://www.lydsy.com/JudgeOnline/problem.ph ...

  3. python操作YAML文件之pyyaml库

    1. YAML简介 YAML是一种被认为可以超越XML.JSON的配置文件,最早接触是Spring Boot,木有想到python也是支持的,遂研究一下. python解析YAML库叫做pyyaml, ...

  4. spring3-spring的事务管理机制

    1. Spring的事务管理机制 Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的: PlatformTransactionManager:事务管理器—主要用于平 ...

  5. Python ctypes中cast/py_object用法

    class ctypes.py_object Represents the C PyObject * datatype. Calling this without an argument create ...

  6. 一键切图 PS 动作 【收藏】

    使用方法 一键切图动作.zip 1. 下载动作 2. 打开PS 动作 窗口,导入动作 3. 选中图层后 点击 F2 一键切图 详情看原文链接 原文链接

  7. 【Tomcat】 windows下注册tomcat服务以及设置jvm参数

    注册服务: 1 >cd /d D:\Java\tomcat-7.0.57-Css\bin //进入目录 1 >service.bat install  //注册服务,同理删除服务为 rem ...

  8. C++——map注意事项

    1. C++标准模块库STL中提供了两种基本的关联容器:set和map.其内部实现是都是采用红黑树,但不同的是,set中结点存储的是键值,map中结点存储的是<key,value>的键值对 ...

  9. 基于TCP协议的聊天室控制台版

    我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...

  10. php琐碎

    1.类中的常量,可以用类来引用: class MyClass() { const SUCCESS ="success"; const FAIL ="fail"; ...