算法实验7(部分背包、田忌赛马)
1、部分背包
设有编号为1、2、…、n的n个物品,它们的重量分别为w1、w2、…、wn,价值分别为v1、v2、…、vn,其中wi、vi(1≤i≤n)均为正数。
有一个背包可以携带的最大重量不超过W。求解目标:在不超过背包负重的前提下,使背包装入的总价值最大(即效益最大化),与0/1背包问题的区别是,这里的每个物品可以取一部分装入背包。
1 n=int(input('请输入商品数量:')) 2 p=input('请以空格为间隔输入每个商品价值:') 3 v=input('请以空格为间隔输入每个商品体积:') 4 c=int(input('请输入背包容量:')) 5 6 Ratio = [] 7 P = [int(i) for i in p.split( )] 8 V = [int(i) for i in v.split( )] 9 for m in range(n): 10 t=P[m]/V[m] 11 Ratio.append(t) 12 13 Ratio.sort(reverse=True) 14 15 ans = 0 16 i = 0 17 while c>0 and i<n: 18 if V[i]<=c: 19 ans = ans+P[i] 20 c = c-V[i] 21 else: 22 ans = ans+c*Ratio[i] 23 c = 0 24 i = i+1 25 print('最大值:',ans)

2、田忌赛马
中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?
可以参考:https://www.jianshu.com/p/ef8adc6efd17
1 n = int(input('请输入双方马的数量:')) 2 3 v1 = input('请用空格分隔输入田忌马的速度:') 4 v2 = input('请用空格分隔输入齐王马的速度:') 5 6 V1 = [int(i) for i in v1.split()] 7 V2 = [int(i) for i in v2.split()] 8 V1.sort(reverse=True) 9 V2.sort(reverse=True) 10 11 ans = 0 12 i = 0 13 for i in range(n):#要让田忌速度的排列优势最大化,比得过就比,比不过,就用最垃圾的去比 14 if V1[0]>V2[0]: 15 ans+=200 16 del V1[0],V2[0] 17 else: 18 x = len(V1) 19 ans-=200 20 del V1[x-1],V2[0] 21 22 print('田忌可能赢钱:',ans)

浙公网安备 33010602011771号