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

GeeksForGeeks提交与自定义输入同测试用例判题结果不一致问题排查

分数背包问题提交错误排查

问题背景

练习分数背包问题时,提交代码到在线判题系统显示答案错误,但使用相同测试用例通过自定义输入运行时,能得到判题系统预期的结果,已排除全局/静态变量问题。

解题思路

  • 基于价值/重量比(value/weight ratio)创建哈希表,键为比率,值为物品对象
  • 按比率降序排序哈希表
  • 遍历排序后的物品,若物品重量≤剩余容量则加入完整价值并减少剩余容量,否则按剩余容量取对应比例价值后结束
  • 返回最终总价值

问题代码

### Item class for reference 
class Item:
    def __init__(self,val,w):
        self.value = val
        self.weight = w
        
class Solution:    
    def fractionalknapsack(self, W,arr,n):
        
        hashmap = {(item.value / item.weight) : item for i,item in enumerate(arr) }
        keys = list(hashmap.keys())
        keys.sort()
        sorted_hashmap = {}
        keys.reverse()
        
        for ele in keys :
            sorted_hashmap[ele] = hashmap[ele]
        
        final_ans = 0
        available_weight = W
        for ratio,item in sorted_hashmap.items() :
            if available_weight > 0 : 
                if item.weight <= available_weight :
                    final_ans += item.value
                    available_weight -= item.weight
                else :
                    final_ans += available_weight * ratio
                    break
            else :
                break
                
                    
        return final_ans

测试用例情况

  • 输入:
    84 87
    78 16 94 36 87 43 50 22 63 28 91 10 64 27 41 27 73 37 12 19 68 30 83 31 63 24 68 36 30 3 23 9 70 18 94 7 12 43 30 24 22 20 85 38 99 25 16 21 14 27 92 31 57 24 63 21 97 32 6 26 85 28 37 6 47 30 14 8 25 46 83 46 15 18 35 15 44 1 88 9 77 29 89 35 4 2 55 50 33 11 77 19 40 13 27 37 95 40 96 21 35 29 68 2 98 3 18 43 53 7 2 31 87 42 66 40 45 20 41 30 32 18 98 22 82 26 10 28 68 7 98 4 87 16 7 34 20 25 29 22 33 30 4 20 71 19 9 16 41 50 97 24 19 46 47 2 22 6 80 39 65 29 42 1 94 1 35 15
    
  • 预期输出:1078.00
  • 提交输出:235.58
  • 自定义输入输出:1078.00

问题分析与修复

核心问题

使用字典存储比率与物品的映射时,若多个物品的价值/重量比相同,字典的键会被覆盖,导致仅保留最后一个同比率的物品,丢失了其他同比率的物品。遍历计算时,这些丢失的物品未被计入总价值,最终导致提交结果远低于预期。

修复方案

直接对物品列表按价值/重量比降序排序,无需使用字典,确保所有物品都能被纳入计算。

修正后代码

class Item:
    def __init__(self,val,w):
        self.value = val
        self.weight = w
        
class Solution:    
    def fractionalknapsack(self, W, arr, n):
        # 按价值/重量比降序排序物品
        arr.sort(key=lambda x: (x.value / x.weight), reverse=True)
        
        final_ans = 0.0
        available_weight = W
        
        for item in arr:
            if available_weight <= 0:
                break
            # 物品能完全放入背包
            if item.weight <= available_weight:
                final_ans += item.value
                available_weight -= item.weight
            else:
                # 取部分物品
                final_ans += available_weight * (item.value / item.weight)
                available_weight = 0
        
        return final_ans

内容的提问来源于stack exchange,提问作者Aditya Kalhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:38:17