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

我媳妇对我买书藏书颇不以为然,认为现在这年头看些闲书没啥用—-虽然她也是科班出身,还是学文的。
给我感觉,似乎大多数女人结婚后就对书产生免疫了,她们更关心柴米油盐、服装美容等等,,像李清照那样与丈夫赌书为乐的雅妻可遇不可求啊!

转载请注明:@小五义

题目:借书方案
内容:小明有五本新书,要借给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
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图