The Fun Of Algorithm - Day5 - 借书方案

问题描述

小明有5本书,要借给A,B,C三位小朋友,若每人只能借1本,则可以有多少种不同的借法?

问题分析

从5个数中取3个不同的数的排列组合,同时由于一本书不能借给一个以上的人,因此只有三人所选的编号必须不同。

算法设计

依然用穷举循环方法实现,根据条件限制 if a!=b and a!=c and c!=b 进行判断。

另外performance版本,如果前两个人所选书号相同,无论第三个人所选书号与前两个人相同与否,都是无效的借阅方法。可在执行第三个循环之前先判定前两个人的编号是否相同,进而提高效率。

Code

Basic verison

# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 借书方案

import time

# add timer to calculate the performance
# Basic performance
###############################################################

start = time.time()

if __name__=='__main__':
    # A,B,C三位小朋友,5本书,每人每次只能借一本
    # 用a,b,c分别表示三人所选图书的编号
    i=0 #i表示有效借阅次数
    print('A,B,C三人所选书号分别为:')
    for a in range(1,6):  #用来控制A借阅图书的编号
        for b in range(1,6):
            for c in range(1,6):
                if a!=b and a!=c and c!=b:
                    print('A:%2d B:%2d C:%2d  ' %(a,b,c),end='')
                    i+=1
                    if i%4==0:
                        print() #加换行
    print('共有%d种有效借阅方法' %i)



end = time.time()
print("The Basic Runtime is {0}".format((end-start)))

结果:

A,B,C三人所选书号分别为:
A: 1 B: 2 C: 3  A: 1 B: 2 C: 4  A: 1 B: 2 C: 5  A: 1 B: 3 C: 2  
A: 1 B: 3 C: 4  A: 1 B: 3 C: 5  A: 1 B: 4 C: 2  A: 1 B: 4 C: 3  
A: 1 B: 4 C: 5  A: 1 B: 5 C: 2  A: 1 B: 5 C: 3  A: 1 B: 5 C: 4  
A: 2 B: 1 C: 3  A: 2 B: 1 C: 4  A: 2 B: 1 C: 5  A: 2 B: 3 C: 1  
A: 2 B: 3 C: 4  A: 2 B: 3 C: 5  A: 2 B: 4 C: 1  A: 2 B: 4 C: 3  
A: 2 B: 4 C: 5  A: 2 B: 5 C: 1  A: 2 B: 5 C: 3  A: 2 B: 5 C: 4  
A: 3 B: 1 C: 2  A: 3 B: 1 C: 4  A: 3 B: 1 C: 5  A: 3 B: 2 C: 1  
A: 3 B: 2 C: 4  A: 3 B: 2 C: 5  A: 3 B: 4 C: 1  A: 3 B: 4 C: 2  
A: 3 B: 4 C: 5  A: 3 B: 5 C: 1  A: 3 B: 5 C: 2  A: 3 B: 5 C: 4  
A: 4 B: 1 C: 2  A: 4 B: 1 C: 3  A: 4 B: 1 C: 5  A: 4 B: 2 C: 1  
A: 4 B: 2 C: 3  A: 4 B: 2 C: 5  A: 4 B: 3 C: 1  A: 4 B: 3 C: 2  
A: 4 B: 3 C: 5  A: 4 B: 5 C: 1  A: 4 B: 5 C: 2  A: 4 B: 5 C: 3  
A: 5 B: 1 C: 2  A: 5 B: 1 C: 3  A: 5 B: 1 C: 4  A: 5 B: 2 C: 1  
A: 5 B: 2 C: 3  A: 5 B: 2 C: 4  A: 5 B: 3 C: 1  A: 5 B: 3 C: 2  
A: 5 B: 3 C: 4  A: 5 B: 4 C: 1  A: 5 B: 4 C: 2  A: 5 B: 4 C: 3  
共有60种有效借阅方法
The Basic Runtime is 0.0

Performance version

# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 借书方案

import time

# add timer to calculate the performance
# Basic performance
###############################################################

start = time.time()

if __name__=='__main__':
    # A,B,C三位小朋友,5本书,每人每次只能借一本
    # 用a,b,c分别表示三人所选图书的编号
    i=0 #i表示有效借阅次数
    print('A,B,C三人所选书号分别为:')
    a=1
    while a<=5:
        b=1
        while b<=5:
            c=1
            while c<=5 and a!=b:
                if a!=c and b!=c:
                    print('A:%2d B:%2d C:%2d  ' % (a, b, c), end='')
                    i += 1
                    if i % 4 == 0:
                        print()  # 加换行
                c+=1
            b+=1
        a+=1
print('共有%d种有效借阅方法' %i)



end = time.time()
print("The Basic Runtime is {0}".format((end-start)))

结果:

A,B,C三人所选书号分别为:
A: 1 B: 2 C: 3  A: 1 B: 2 C: 4  A: 1 B: 2 C: 5  A: 1 B: 3 C: 2  
A: 1 B: 3 C: 4  A: 1 B: 3 C: 5  A: 1 B: 4 C: 2  A: 1 B: 4 C: 3  
A: 1 B: 4 C: 5  A: 1 B: 5 C: 2  A: 1 B: 5 C: 3  A: 1 B: 5 C: 4  
A: 2 B: 1 C: 3  A: 2 B: 1 C: 4  A: 2 B: 1 C: 5  A: 2 B: 3 C: 1  
A: 2 B: 3 C: 4  A: 2 B: 3 C: 5  A: 2 B: 4 C: 1  A: 2 B: 4 C: 3  
A: 2 B: 4 C: 5  A: 2 B: 5 C: 1  A: 2 B: 5 C: 3  A: 2 B: 5 C: 4  
A: 3 B: 1 C: 2  A: 3 B: 1 C: 4  A: 3 B: 1 C: 5  A: 3 B: 2 C: 1  
A: 3 B: 2 C: 4  A: 3 B: 2 C: 5  A: 3 B: 4 C: 1  A: 3 B: 4 C: 2  
A: 3 B: 4 C: 5  A: 3 B: 5 C: 1  A: 3 B: 5 C: 2  A: 3 B: 5 C: 4  
A: 4 B: 1 C: 2  A: 4 B: 1 C: 3  A: 4 B: 1 C: 5  A: 4 B: 2 C: 1  
A: 4 B: 2 C: 3  A: 4 B: 2 C: 5  A: 4 B: 3 C: 1  A: 4 B: 3 C: 2  
A: 4 B: 3 C: 5  A: 4 B: 5 C: 1  A: 4 B: 5 C: 2  A: 4 B: 5 C: 3  
A: 5 B: 1 C: 2  A: 5 B: 1 C: 3  A: 5 B: 1 C: 4  A: 5 B: 2 C: 1  
A: 5 B: 2 C: 3  A: 5 B: 2 C: 4  A: 5 B: 3 C: 1  A: 5 B: 3 C: 2  
A: 5 B: 3 C: 4  A: 5 B: 4 C: 1  A: 5 B: 4 C: 2  A: 5 B: 4 C: 3  
共有60种有效借阅方法
The Basic Runtime is 0.001001596450805664
上一篇:Linux运维(基础模块)--day5(Vim编辑器)


下一篇:day5