python趣味编程:借书方案(排列组合)

简介: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 题目:借书方案内容:小明有五本新书,要借给A、B、C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法。问题分析和算法设计:本问题实际上就是一个排列问题,即求从5个中取3个进行排列的方法有多少。

转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi

题目:借书方案
内容:小明有五本新书,要借给A、B、C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法。
问题分析和算法设计:
本问题实际上就是一个排列问题,即求从5个中取3个进行排列的方法有多少。首先对五本书从1至5进行编号,然后使用穷举的方法,假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就满足题意。
具体代码:

 

# -*- coding: cp936 -*-
##@小五义 http://www.cnblogs.com/xiaowuyi
'''
借书方案:小明有五本新书,要借给A、B、C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法。
'''
count=0  #记录第几种分法
print "假设五本书分别为1,2,3,4,5,主要借法有"
for a in range(1,6):
    for b in range(1,6):
        if a!=b:
                
            for c in range(1,6):
                
                if c!=a and c!=b:
                    count+=1
                    print "第%d种:A分到书%d,B分到书%d,C分到书%d"%(count,a,b,c)

运行结果为:

假设五本书分别为1,2,3,4,5,主要借法有
第1种:A分到书1,B分到书2,C分到书3
第2种:A分到书1,B分到书2,C分到书4
第3种:A分到书1,B分到书2,C分到书5
第4种:A分到书1,B分到书3,C分到书2
第5种:A分到书1,B分到书3,C分到书4
第6种:A分到书1,B分到书3,C分到书5
第7种:A分到书1,B分到书4,C分到书2
第8种:A分到书1,B分到书4,C分到书3
第9种:A分到书1,B分到书4,C分到书5
第10种:A分到书1,B分到书5,C分到书2
第11种:A分到书1,B分到书5,C分到书3
第12种:A分到书1,B分到书5,C分到书4
第13种:A分到书2,B分到书1,C分到书3
第14种:A分到书2,B分到书1,C分到书4
第15种:A分到书2,B分到书1,C分到书5
第16种:A分到书2,B分到书3,C分到书1
第17种:A分到书2,B分到书3,C分到书4
第18种:A分到书2,B分到书3,C分到书5
第19种:A分到书2,B分到书4,C分到书1
第20种:A分到书2,B分到书4,C分到书3
第21种:A分到书2,B分到书4,C分到书5
第22种:A分到书2,B分到书5,C分到书1
第23种:A分到书2,B分到书5,C分到书3
第24种:A分到书2,B分到书5,C分到书4
第25种:A分到书3,B分到书1,C分到书2
第26种:A分到书3,B分到书1,C分到书4
第27种:A分到书3,B分到书1,C分到书5
第28种:A分到书3,B分到书2,C分到书1
第29种:A分到书3,B分到书2,C分到书4
第30种:A分到书3,B分到书2,C分到书5
第31种:A分到书3,B分到书4,C分到书1
第32种:A分到书3,B分到书4,C分到书2
第33种:A分到书3,B分到书4,C分到书5
第34种:A分到书3,B分到书5,C分到书1
第35种:A分到书3,B分到书5,C分到书2
第36种:A分到书3,B分到书5,C分到书4
第37种:A分到书4,B分到书1,C分到书2
第38种:A分到书4,B分到书1,C分到书3
第39种:A分到书4,B分到书1,C分到书5
第40种:A分到书4,B分到书2,C分到书1
第41种:A分到书4,B分到书2,C分到书3
第42种:A分到书4,B分到书2,C分到书5
第43种:A分到书4,B分到书3,C分到书1
第44种:A分到书4,B分到书3,C分到书2
第45种:A分到书4,B分到书3,C分到书5
第46种:A分到书4,B分到书5,C分到书1
第47种:A分到书4,B分到书5,C分到书2
第48种:A分到书4,B分到书5,C分到书3
第49种:A分到书5,B分到书1,C分到书2
第50种:A分到书5,B分到书1,C分到书3
第51种:A分到书5,B分到书1,C分到书4
第52种:A分到书5,B分到书2,C分到书1
第53种:A分到书5,B分到书2,C分到书3
第54种:A分到书5,B分到书2,C分到书4
第55种:A分到书5,B分到书3,C分到书1
第56种:A分到书5,B分到书3,C分到书2
第57种:A分到书5,B分到书3,C分到书4
第58种:A分到书5,B分到书4,C分到书1
第59种:A分到书5,B分到书4,C分到书2
第60种:A分到书5,B分到书4,C分到书3


    下面我们把这个问题扩展一下,做一个更加通用的程序,就是将m本书分给n个小朋友,共中n<=m,要求每人每次只能分到一本。排列组合这个古老的问题解法有很多,这里我们用的方法是先从m本书中取出n本,然后对n本进行排列。于是我们分步实现:
第一步,从m本书中取出n本,具体代码:

# -*- coding: cp936 -*-
'''
对m个数中取n个的取法
'''
##@小五义 http://www.cnblogs.com/xiaowuyi
def combination(lst,n):
    rst = []
    if n == 1:
        for i in lst:
            l = []
            l.append(i)
            rst.append(l)
    else:
        for i in combination(lst,n-1):
            for j in range(lst.index(i[-1])+1,len(lst)):
                l = i[:]
                l.append(lst[j])
                rst.append(l)
    return rst


if __name__ == "__main__":
    rst = []#记录书的组合
    lst=[]#将书编号
    numlist=[]#记录数组合后的数字
    
    num=raw_input('输入数的本数m:')
    for i in range(1,int(num)+1):
        lst.append(str(i))
    print lst
    
    i=raw_input('输入小朋友数量n:')
    ivrst = combination(lst,int(i))
    rst = rst + ivrst
    
    for i in rst:#将得到的组合读出
        print i
        numstr=''
        for j in i:#将组合组成数字
            numstr=numstr+j
        numlist.append(numstr)
    print numlist
        

 

第二步,对n本书进行排列,具体代码:

# -*- coding: cp936 -*-
'''
对m个数进行排列
'''
##@小五义 http://www.cnblogs.com/xiaowuyi
import time,sys

def permute(num):
    l = len(num)
    if l <= 2:
        if l == 2:
            return [num,num[1],num[0],num[1]+num[0]]
        else:
            return [num]
    else:
        list = []
        for i in range(len(num)):
            li = num[:i]+num[i+1:]
            #print 'li=',li
            for x in permute(li):
                p=num[i:i+1]+x
                list.append(p)
        return list

num = raw_input('the number:')
list1 = permute(num)

list1= [''.join(x) for x in list1 if len(x)==len(num)]
print list1


最后,将前两步合并,并将程序进行完善。

# -*- coding: cp936 -*-
##@小五义 http://www.cnblogs.com/xiaowuyi
'''
借书方案:小明有m本新书,要借给n位小朋友,若每人每次只能借一本,则可以有多少种不同的借法。
'''

def combination(lst,n):#将lst中取出n个进行组合
    rst = []
    if n == 1:
        for i in lst:
            l = []
            l.append(i)
            rst.append(l)
    else:
        for i in combination(lst,n-1):
            for j in range(lst.index(i[-1])+1,len(lst)):
                l = i[:]
                l.append(lst[j])
                rst.append(l)
    return rst
def permute(num):#将书进行排列
    l = len(num)
    if l <= 2:
        if l == 2:
            return [num,num[1],num[0],num[1]+num[0]]
        else:
            return [num]
    else:
        list = []
        for i in range(len(num)):
            li = num[:i]+num[i+1:]
            #print 'li=',li
            for x in permute(li):
                p=num[i:i+1]+x
                list.append(p)
        return list

if __name__ == "__main__":
    count=0  #记录第几种分法
    rst = []#记录书的组合
    lst=[]#将书编号
    numlist=[]#记录数组合后的数字
    num_bool=True #用来判断小朋友数不大于书的数量
    book_list=[]#记录最后组合数
    ##判断小朋友数不大于书的数量
    while num_bool:
        try:
            books=int(raw_input('小明一共有书的数量:'))
            baby=int(raw_input('要分给的小朋友数量(不大于书的数量)'))
            if baby>books or books==0 or baby==0:
                print'输入错误,请重新输入。'
                num_bool=True
            else:
                num_bool=False
        except:
            print'输入错误,请重新输入。'
            num_bool=True
    for i in range(1,books+1):
        lst.append(str(i))
    books_com=combination(lst,baby)
    rst=rst+books_com
    for i in rst:#将得到的组合读出
        numstr=''
        for j in i:#将组合组成数字
            numstr=numstr+j
        numlist.append(numstr)
    ##print numlist
    for i in numlist:
        list1=permute(i)
        ##book_list=[''.join(x) for x in list1 if len(x)==len(i)]
        for x in list1:
            if len(x)==len(i):
                book_list.append(x)
    for i in book_list:
        count+=1
        print "第%d种:%s"%(count,i)

运行结果为:

小明一共有书的数量:5
要分给的小朋友数量(不大于书的数量)3
第1种:123
第2种:132
第3种:213
第4种:231
第5种:312
第6种:321
第7种:124
第8种:142
第9种:214
第10种:241
第11种:412
第12种:421
第13种:125
第14种:152
第15种:215
第16种:251
第17种:512
第18种:521
第19种:134
第20种:143
第21种:314
第22种:341
第23种:413
第24种:431
第25种:135
第26种:153
第27种:315
第28种:351
第29种:513
第30种:531
第31种:145
第32种:154
第33种:415
第34种:451
第35种:514
第36种:541
第37种:234
第38种:243
第39种:324
第40种:342
第41种:423
第42种:432
第43种:235
第44种:253
第45种:325
第46种:352
第47种:523
第48种:532
第49种:245
第50种:254
第51种:425
第52种:452
第53种:524
第54种:542
第55种:345
第56种:354
第57种:435
第58种:453
第59种:534
第60种:543

可以看出,下面的这个程序对第一程序进行了扩展,更加具有通用性。

目录
相关文章
|
9天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!
|
3天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
6天前
|
机器学习/深度学习 移动开发 Python
【10月更文挑战第11天】「Mac上学Python 22」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。
42 4
|
10天前
|
机器学习/深度学习 数据采集 数据挖掘
探索Python编程的奥秘
【10月更文挑战第7天】本文将带你走进Python的世界,探索其背后的逻辑与魅力。我们将从基础语法开始,逐步深入到函数、面向对象编程等高级特性,最后通过实际项目案例,让你体验Python的强大与便捷。无论你是编程新手,还是有一定基础的开发者,都能在这篇文章中找到你需要的信息和启发。
|
11天前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!
|
8天前
|
数据采集 开发框架 数据处理
探索Python的灵活性:简化日常编程任务
【10月更文挑战第7天】 【10月更文挑战第9天】 在本文中,我们将深入探讨Python编程语言的强大功能和灵活性。通过具体的代码示例,我们会展示如何利用Python简化日常编程任务,提高效率。无论是数据处理、自动化脚本还是Web开发,Python都能提供简洁而强大的解决方案。我们还将讨论一些最佳实践,帮助你编写更清晰、更高效的代码。
10 1
|
13天前
|
存储 人工智能 Java
Python编程入门:从基础到实战
【10月更文挑战第4天】本文旨在为初学者提供一个全面而深入的Python编程学习路径。我们将从Python的基本语法和概念开始,然后逐步深入到更复杂的主题,如数据结构、面向对象编程和异常处理等。最后,我们将通过一些实际的项目案例,帮助读者将理论知识应用到实践中去。无论你是编程新手,还是有一定经验的开发者,都可以在这篇文章中找到适合自己的学习内容。让我们一起开启Python编程的学习之旅吧!
|
12天前
|
存储 人工智能 数据挖掘
探索Python编程:从基础到进阶
【10月更文挑战第5天】在数字时代的浪潮中,掌握编程技能已成为一项宝贵的能力。本文旨在为初学者提供一个深入浅出的Python编程之旅,从基本概念到实际应用,逐步揭示编程之美。无论你是编程新手还是希望深化理解,跟随这篇文章的脚步,你将学会如何用Python语言构建你的第一个程序,并了解代码背后的逻辑。让我们开始吧,解锁编程的秘密,开启你的技术成长之路!
|
13天前
|
数据可视化 Python
Python编程之数据可视化入门
【10月更文挑战第4天】在数字时代的洪流中,数据如同星辰般璀璨,而将它们绘制成图表,便是我们探索宇宙的方式。本文将带你启航,用Python这艘航船,驶向数据可视化的奥秘。我们将从安装必要的工具包开始,逐步深入到数据的呈现,最后通过代码示例点亮知识的灯塔,指引你在数据海洋中航行。让我们握紧舵盘,乘风破浪,揭开数据背后的故事吧!
|
12天前
|
数据采集 程序员 开发者
Python编程入门:从基础到实战
【10月更文挑战第5天】本文旨在为初学者提供一条清晰的Python学习路径,涵盖基础知识、关键概念、实战项目以及常见问题解答。我们将通过简单易懂的语言和实际代码示例,帮助读者快速掌握Python编程技能。无论你是零基础的新手还是有一定经验的开发者,都能在这篇文章中找到有价值的信息。让我们一起开启Python编程之旅吧!