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])
浙公网安备 33010602011771号