问题简述
“”"
部分背包问题:
输入:n个物品组成的集合O,每个物品有两个属性Vi和Pi,分别表示体积和价格
背包容量为C
输出:求解一个解决方案S={Xi|1<=i<=n,0<=Xi<=1},使得:
优化目标为max(Xi·Pi的总和)
约束条件为(Xi·Vi的总和)小于等于C
“”"
代码
def FranctionalKnapsack(n, p, v, C):
"""
:param n: 商品数量n
:param p: 各商品的价值p
:param v: 各商品的体积v
:param C: 背包容量C
:return: 商品价格的最大值,最优方案
计算商品性价比Ratio[1...n]并按降序排序
"""
# Ratio[i],p[i],v[i]分别表示性价比第i大的商品的性价比、价格和体积
Ratio = [p[i] / v[i] for i in range(n)]
for i in range(1, n): # 假设第一个为有序列表,从下标1开始
for j in range(i):
if p[j] / v[j] < p[i] / v[i]:
p