python排列组合算法的运用

在使用python进行运算的时候,经常会遇到对list或者dict中任意两个元素,或者任意多个元素之间进行运算,这就涉及到了排列组合的知识。比较幸运的是在python的itertools包中提供了和排列组合相关的函数

 

from itertools import combinations,permutations
 
a=[1,2,3,4]
b=[2,4,6,8]
c = list(combinations(a,2))
d = list(permutations(b,3))
print(c)
print(d)
 
 
运算结果:
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
[(2, 4, 6), (2, 4, 8), (2, 6, 4), (2, 6, 8), (2, 8, 4), (2, 8, 6), (4, 2, 6), (4, 2, 8), (4, 6, 2), (4, 6, 8), (4, 8, 2), (4, 8, 6), (6, 2, 4), (6, 2, 8), (6, 4, 2), (6, 4, 8), (6, 8, 2), (6, 8, 4), (8, 2, 4), (8, 2, 6), (8, 4, 2), (8, 4, 6), (8, 6, 2), (8, 6, 4)]

 

下面结合场景对combinations函数进行具体的运用:

 

妮妮正在准备一场期末考试,共有n道题目,每一道题目妮妮能答对的概率记为ai,i€{1,2,....,n},每一道题目对应的分数记为pi,i€{1,2,....,n}

为了尽可能考好,妮妮可以复习其中的m道题,并且复习的m道题都可以保证答对,现设计一个程序,挑选出m道题来复习,保证妮妮得到的

分数的期望最大,并输出这个最大的期望分数  (期望分数 = Σaipi)

 

输入:

第一行:题目的个数n

第二行:可复习题目的个数m

第三行:每个题目答对的概率ai

第四行:每个题目对应的分数pi

 

输出:

最大的期望分数

 

思路:1.生成一个list(range(0,n)),从中选取m个下标,a[m]即要修改为1的列表元素

   2.依次从所有排列中取出一项,与m个下标对比,如果出现的次数为1,则表示a[m]=1

   3.计算出sum,并用sort排序即可

 

代码如下:

from itertools import combinations, permutations
n = int(input())
m = int(input())
#为方便输入,这里输入整数
a = list(map(int,input().split()))
p = list(map(int,input().split()))
#用列表表达式,将每一项处理为概率
a = [i/100 for i in a]
#用于存储所有的期望分数
sum_res = []


#从0~n-1选出m个下标
sign = list(range(0,n))
con = list(combinations(sign,m))

#将所有结果都转化为列表,方便操作
for i in range(0,len(con)):
    con[i] = list(con[i])


#依次遍历出con中的结果
for i in con:
    #每次内循环结束更新sum和b的值
    sum = 0
    b = a + []
    #依次比对m与n中的坐标
    for j in range(0,n):
        if(i.count(j)==1):
            b[j]=1
    #print(b)
    
    #算出期望分数
    for x in range(0,n):
        sum = sum+b[x]*p[x]
    #print(sum)
    
    #存储期望分数
    sum_res.append(sum)

#打印出所有可能的情况
print(con)
print(sum_res)
sum_res.sort()
print(sum_res)
#输出sort后最大的分数
print(sum_res[len(sum_res)-1])

 

posted @ 2022-08-24 15:03  嗨克龙  阅读(413)  评论(0)    收藏  举报