背包问题 python 实现

现在在学习王晓华老师的算法课程,暂时不会写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来赋值

猜你喜欢

转载自blog.csdn.net/sinat_32682001/article/details/88986294
今日推荐