问题描述:容量800ml的杯子,可任选不超过体积上限的饮料混合,所用饮料价格之和最高获胜:
def BubbleSort(v, w): ## 排序函数
x = [0 for i in range(len(v))] ## 定义性价比数组
z = [0 for i in range(len(v))]
y = dict() ## 创建新字典(用来存储性价比一开始所在的数组位置)
for i in range(len(v)):
x[i] = v[i]/w[i] ## 求出各饮料的性价比
# print(x)
for i in range(len(x)): ## 创建字典,用性价比做key,原始位置做value
y[str(x[i])]=i ## 将性价比的原始位置存入y字典中
# print(y)
## 遍历所有数组元素
for i in range(len(x)):
for j in range(0, len(x)-i-1):
if (x[j] < x[j+1]): ## 性价比由高到低输出
x[j], x[j+1] = x[j+1], x[j]
for i in range(len(x)): ## 用一个新的数组存储性价比从高到低的原始数组位置
z[i] = y.get(str(x[i]))
print("性价比高到低的原始数组位置:")
print(z)
print("排序后性价比:")
print(x)
return z ## 返回性价比排序后的位置数组
def FractionlKnapsack(v, w, c, xjb): ## 贪心策略
ma = 0 ## 饮料价值
for i in xjb:
if(w[i] < c): ## 当容量足够,则全部倒入
ma = v[i]+ma
c = c-w[i]
elif(c > 0): ## 容量不足,部分倒入(把部分倒入的价值算出来加进去)
ma = ma+v[i]/w[i]*c
c = 0
print("饮料的最大价值为:")
print(ma)
调用函数:
Value = [60,10,36,16,45]
Weight = [600,250,200,100,300]
C = 800
xjb = BubbleSort(Value, Weight) ## 排序性价比
FractionlKnapsack(Value, Weight, C, xjb) ## 贪心策略求最大值
贪心策略与动态规划对比:贪心策略物品可分割,动态规划物品不可分割(连续和离散)
贪心只看到了局部最优情况(只在乎眼前)不一定能得到全局最优(例如01背包就不行),因为01背包是离散的,物品不可分割。