算法实验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)
posted @ 2022-04-30 11:08  逃离汽车尾气  阅读(209)  评论(0)    收藏  举报