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

如何优化canPack方法逻辑?判断面粉袋能否凑够目标重量

优化小程序中canPack方法的算法实现

嘿,我看了你这个用于面粉袋组合判断的canPack方法问题,用一堆嵌套的if/else不仅代码冗余,还很容易漏掉边界场景,维护起来也头疼。咱们来换个更简洁且逻辑严谨的思路重构它:

问题核心梳理

我们的目标是判断:用最多bigCount个5公斤袋 + 最多smallCount个1公斤袋,能否刚好凑出goal公斤的重量。核心逻辑其实可以拆解成两步:

  1. 先尽可能用大袋(但不能超过现有数量,也不能超过目标重量需要的大袋数)
  2. 剩下的重量用小袋来凑,看小袋数量是否足够

优化后的代码实现

public static boolean canPack(int bigCount, int smallCount, int goal) {
    // 第一步:过滤非法输入,任何参数为负直接返回false
    if (bigCount < 0 || smallCount < 0 || goal < 0) {
        return false;
    }
    
    // 计算最多能使用的大袋数量:取"现有大袋数"和"目标重量需要的大袋数"的最小值
    int maxBigBags = Math.min(bigCount, goal / 5);
    
    // 计算用了最大可行大袋后,剩余需要凑的重量
    int remainingWeight = goal - maxBigBags * 5;
    
    // 剩余重量能被现有小袋覆盖,就返回true,否则false
    return remainingWeight <= smallCount;
}

为什么这个逻辑更可靠?

咱们用你给出的测试案例验证:

当bigCount=1、smallCount=0、goal=4时:

  • maxBigBags = Math.min(1, 4/5)=0
  • remainingWeight=4-0=4
  • 4>0,返回false,完全符合预期

再举几个边界场景验证:

  • 场景1:bigCount=2、smallCount=3、goal=13 → 用2个大袋(10kg),剩3kg,小袋刚好够,返回true
  • 场景2:goal=0 → 不需要任何袋子,返回true(符合逻辑,因为凑0重量本身是成立的)
  • 场景3:bigCount=0、smallCount=5、goal=3 → 直接用3个小袋,返回true
  • 场景4:bigCount=3、smallCount=2、goal=17 → 3个大袋是15kg,剩2kg,小袋够,返回true

这个逻辑完全覆盖了所有可能的合法场景,而且代码简洁易读,不会像原代码那样因为嵌套判断出现逻辑漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:12:55