背包问题

背包问题

一个小偷在某个商店发现有n个商品,第i个商品价值vi元,重w;千克。他希望拿走的价值尽量高,但他的背包最多只能容纳W千克的东西。他应该拿走哪些商品?

问题思路:每次拿性价比最高的东西,即v/w价值最大的东西,拿满之后拿第二价值高的东西,以此类推

分数背包:对于一个商品,小偷可以拿走其中任意一部分。

复制代码
# 分数背包问题

goods = [(60, 10),(100, 20),(120, 30)]  # 每个商品元组表示(价格,重量)
goods.sort(key=lambda x: x[0]/x[1], reverse=True)  # 将商品按照性价比排序

def fractional_backpack(goods, w):  # w为背包容量
    m = [0 for _ in range(len(goods))]
    total_val = 0  # 总价值
    for i, (prize, weight) in enumerate(goods):
        if w >= weight:  # 背包的容量大于商品的重量
            m[i] = 1
            total_val += prize  # 计算价值
            w -= weight  # 更新剩余容量
        else:   # 如果不是整个
            m[i] = w / weight
            total_val += m[i] * prize
            w = 0
            break
    return m, total_val

print(fractional_backpack(goods, 50))
复制代码

 

posted @   天才九少  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示