python解决组合问题

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

  

时间: 2024-12-15 07:00:04

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

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

在科学计算方面,一般认为matlab是一个超强的东西,此外还有R. 至于某种语言来说,一般都要讲究一些特别的算法,包括但不限于: 矩阵方面的计算 指数计算 对数计算 多项式运算 各类方程求解 总之,只要是数学问题,在python里面,可以使用以下任何一个来解决 NumPy SciPy matplotlib ETS 顺便推荐一本书<用Python做科學計算>.地址是:http://myshare.dscloud.me/scipydoc/(不做超链接,看看能不能发布) 所以,用python解决数学

Python解决中文乱码问题

在Python中内部所有编码都是Unicode,Unicode属于中转码,一般来说,是先把乱码转化为中转码,再转化为我 们需要的编码,转换过程为decode -> unicode -> encode. #coding:utf-8 #-*- coding:utf-8 -*- import sys print sys.getdefaultencoding() print '中国' f = open('Hello.txt') data = f.read() f.close() print data.

高德API+Python解决租房问题

项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时.项目由ekCit发布在实验楼,完整教程及在线练习地址:高德API+Python解决租房问题,可以直接在教程中下载代码使用demo. 一.介绍 1. 背景 项目来自一段租房血泪史(夸张):事情是这样的,笔者是接着念大四准备考研,而室友是应届毕业在找工作,说白了就是都没有钱,于是打算合租.因为穷所以不可能找有门店的的中介

python解决导入自定义库失败: ModuleNotFoundError: No module named &#39;MyLib&#39;

python安装目录:...\python_3_6_1_64bit 新建文件:chenyeubai.pth,写入库所在的绝对路径E:\workSpace\my_code\learn\myLib 安装路径下的.pth文件会在运行时将文件中路径写入path python解决导入自定义库失败: ModuleNotFoundError: No module named 'MyLib' 原文地址:https://www.cnblogs.com/chenyuebai/p/8416706.html

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

appium+python解决每次运行代码都提示安装Unlock以及AppiumSetting的问题(部分安卓机型) 1.修改appium-android-driver\lib下的android-helpers.js文件 安装路径\appium-desktop\resources\app\node_modules\appium\node_modules\appium-android-driver\lib\android-helpers.js //await adb.install(unicode

Python 解决: from pip import main ImportError: cannot import name &#39;main&#39;

此次报错是因为 pip 升级出的问题: 解决方案1: python3 -m pip install 模块名 解决方案2: 进入 pip3 的文件夹 sudo vi /usr/bin/pip3 修改:from pip import main 为:from pip._internal import main 然后保存退出. 再运行 pip3 install 模块名 就能成功了! 转自:https://blog.csdn.net/qq_33811662/article/details/80615353

python的组合数据

python的组合数据包括:1.列表list[   ] 2.元组tuple(),3.字典dict{"x":"y"},4.集合set{} 1.创造组合数据:均可直接使用创造如:list1=[1,2,3,4]  tuple1(1,2,3,4) dict{"1":"2"."3":"4"}    对于list tuple和set可以互相转化 如:list1=[1,2,3,4]  set1=set

python解决排列组合

笛卡尔积:itertools.product(*iterables[, repeat]) import itertools for i in itertools.product('BCDEF', repeat = 2): print(''.join(i),end=",") print('\n') # 输出 BB BC BD BE BF CB CC CD CE CF DB DC DD DE DF EB EC ED EE EF FB FC FD FE FF 两个元组进行笛卡尔积: impo

Python排列组合问题

1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def permutation(elements): if len(elements) <=1: yield elements else: for perm in permutation(elements[1:]): for i in range(len(elements)): yield perm[:i