You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MaxValueSelection函数运行结果存在偏差,如何修复该贪心算法实现?

0-1背包贪心算法问题修复方案

问题根因

  • 你当前采用的贪心策略是按物品总价值从高到低排序选取,完全没有结合重量维度做判断,很容易出现选了单个高重量高价值物品,错过多个轻量高价值物品组合的情况。你的测试用例就是典型场景:原代码返回4000,实际最优收益可达5500。
  • 0-1背包(物品不可拆分)场景下,贪心算法本身无法保证全局最优,如果要求所有测试用例都能得到最大收益,建议使用动态规划实现。

方案1:优化贪心策略(提升准确率,不保证全局最优)

把排序规则改成按单位重量价值降序排序,这是0-1背包场景下效果最好的贪心策略,大多数场景下收益比原策略高很多。
修复后代码:

def maxValueSelection(items,V):
    maxval = 0
    total_weight = 0
    item_list = []
    # 构造包含单位重量价值的列表
    for weight, value in items.values():
        unit_value = value / weight
        item_list.append((-unit_value, weight, value))
    # 按单位重量价值降序排序
    item_list.sort()
    for _, w, v in item_list:
        if total_weight + w <= V:
            maxval += v
            total_weight += w
    return maxval

items = {1:(4,400),2:(9,1800),3:(10,3500),4:(20,4000),5:(2,1000),6:(1,200)}
V = 20
print(maxValueSelection(items,V)) # 输出5500,符合当前测试用例最优解

注意:该优化后的贪心策略仍然存在边界场景无法得到最优解的问题,仅适合对性能要求极高、可接受少量收益损失的场景。


方案2:动态规划实现(100%得到全局最优解)

如果要求所有测试用例都能得到最大收益,建议使用标准0-1背包动态规划解法,时间复杂度O(nV),n为物品数量:

def maxValueSelection(items,V):
    item_list = list(items.values())
    # dp[i]代表总重量不超过i时的最大收益
    dp = [0]*(V+1)
    for w, v in item_list:
        # 倒序遍历避免重复选取同一物品
        for j in range(V, w-1, -1):
            dp[j] = max(dp[j], dp[j-w] + v)
    return dp[V]

items = {1:(4,400),2:(9,1800),3:(10,3500),4:(20,4000),5:(2,1000),6:(1,200)}
V = 20
print(maxValueSelection(items,V)) # 输出5500,为全局最优解

内容的提问来源于stack exchange,提问作者Maheedhar A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:45:03