背包问题 python 实现

本文介绍使用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来赋值

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值