如何优化canPack方法逻辑?判断面粉袋能否凑够目标重量
优化小程序中canPack方法的算法实现
嘿,我看了你这个用于面粉袋组合判断的canPack方法问题,用一堆嵌套的if/else不仅代码冗余,还很容易漏掉边界场景,维护起来也头疼。咱们来换个更简洁且逻辑严谨的思路重构它:
问题核心梳理
我们的目标是判断:用最多bigCount个5公斤袋 + 最多smallCount个1公斤袋,能否刚好凑出goal公斤的重量。核心逻辑其实可以拆解成两步:
- 先尽可能用大袋(但不能超过现有数量,也不能超过目标重量需要的大袋数)
- 剩下的重量用小袋来凑,看小袋数量是否足够
优化后的代码实现
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)=0remainingWeight=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
相关产品推荐
相关产品推荐

