zoukankan      html  css  js  c++  java
  • python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题

    有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子、一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配?

    分析

    换个角度看,现有头、身、腿三个元素,每个元素都有各自的几种状态。

    头元素有['帽1', '帽2', '帽3', '帽4']共4种状态,身元素有['衣1', '衣2', '衣3', '衣4', '衣5']共5种状态,腿元素有['裤1', '裤2', '裤3']共3种状态

    从头开始,自上而下,遍历每个元素的所有状态。

    解的长度是固定的

    这里特别注意:每个元素的状态数目不同!!!

    套用子集树模板即可

    代码

    ```python

    '''取物排列问题'''

    n = 3 # 3个元素

    头、身、腿3个元素各自的状态空间

    a = [['帽1', '帽2', '帽3', '帽4'],
    ['衣1', '衣2', '衣3', '衣4', '衣5'],
    ['裤1', '裤2', '裤3']]

    x = [0]*n # 一个解,长度固定,3元数组
    X = [] # 一组解

    冲突检测

    def conflict(k):

    return False # 无冲突
    

    套用子集树模板

    def match(k): # 到达第k个元素
    global n, a, x, X

    if k >= n:  # 超出最尾的元素
        print(x)
        #X.append(x[:]) # 保存(一个解)
    else:
        for i in a[k]: # 直接a[k],若间接则range(len(a[k]))。 遍历第k个元素的对应的所有选择状态,不同的元素状态数目不同
            x[k] = i
            if not conflict(k): # 剪枝
                match(k+1)
    

    测试

    match(0) # 从头(第0个元素)开始

    
    ### 效果图
    ![](http://images2015.cnblogs.com/blog/709432/201705/709432-20170530161328930-864745624.jpg)
  • 相关阅读:
    基于Python自动生成小学四则运算题目的命令行程序(软工第二次作业)
    第一次个人编程作业
    自我介绍+软工五问
    如何清理 Docker 占用的磁盘空间
    复审与事后分析
    团队作业5——测试与发布(Alpha版本)
    项目冲刺总结集合贴
    团队作业3:需求改进&系统设计
    团队作业2——需求规格说明书
    团队作业1——团队展示&选题
  • 原文地址:https://www.cnblogs.com/hhh5460/p/6920671.html
Copyright © 2011-2022 走看看