现在在学习王晓华老师的算法课程,暂时不会写C++,所以先用Python实现吧。
背包问题,多种物品,每种物品仅有一件,在这里用一个极其简单的贪婪法实现:
根据重量、价值或价值密度都可,只需改变排序依据。
import pandas as pd
import numpy as np
wi = [35, 30, 60, 50, 40, 10, 25]
pi = [10, 40, 30, 50, 35, 40, 30]
status = [0, 0, 0, 0, 0, 0, 0]
data = pd.DataFrame(columns=["weight", "price", "density"])
data["weight"] = wi
data["price"] = pi
data["density"] = data["price"] / data["weight"]
data["status"] = status
reason = "price" # weight or density
rest = 150
values = 0
data = data.sort_values(by=reason, ascending=False).reset_index().drop(["index"], axis=1)
index = 0
def best_weight(data, reason, rest, values, index):
#print(reason, rest, values, index)
if rest < np.min(data.loc[range(index, len(data)), "weight"]) or (index == len(data)):
return values
else:
if rest >= data["weight"][index]:
data.loc[index, 'status'] = 1 # 用data["status"][index] = 1会有warning
rest = rest - data["weight"][index]
values = values + data["price"][index]
index = index + 1
values=best_weight(data, reason, rest, values, index)
return values
else:
index = index + 1
values=best_weight(data, reason, rest, values, index)
return values
yyt = best_weight(data, reason, rest, values, index)
print(yyt)
经同学指点才意识到 return 不止出现在递归结束的地方!
在写代码过程中,时常不确定一些用法,在此总结:
判断dataframe是否为空:df.empty
dataframe排序:df.sort_values(by="",ascending=False)
dataframe 按行删除:df=df[df[""]==1]
datafram可用drop删除指定行列
用dataframe.loc来赋值