力扣 顺丰02. 小哥派件装载问题 js

以下为问题描述

问题

快递小哥每天都需要揽件并骑电瓶车派送快递,假设电瓶车快递箱容量为V,小哥需要派送n个快递,每个快递都有一定的体积大小。
要求在需要派送的n个快递中,任取若干个快递装放入快递箱,不能溢出,使快递箱的剩余空间最小。

输入:

  • n个快递的体积数组:N[],
  • 电瓶车快递箱容量:V

返回:

  • 尽量装满快递后,快递箱剩余的最小容量

示例1

输入:N = [8, 1, 12, 7, 9, 7], V = 11
输出:1
解释:快递箱容量V为11,物品体积数组N为[8, 1, 12, 7, 9, 7],最优解为取体积为
1的快递和体积为9的快递,即快递箱剩余最小空间为 11-(1+9)=1

示例2

输入:N = [8, 2, 12, 7, 9, 7], V = 11
输出:0
解释:11-(2+9) = 0

示例3

输入:N = [8, 2, 12, 7, 9, 7], V = 100
输出:55
解释:100-(8+2+12+7+9+7) = 55

示例4

输入:N = [8, 19, 18,23,16,20], V = 5
输出:5
解释:由于快递箱不能溢出,没有体积小于5的快递,所以快递箱剩余最小空间为5

提示

  • 0 < N.length ≤ 30
  • 0 < N[i] < 2000
  • V为整数:0 ≤ V ≤ 2000

解题代码:

/**
 * @param {number[]} N
 * @param {number} V
 * @return {number}
 */
 var minRemainingSpace = function (N, V) {
      let sum = 0
      let min = 999
      for (let i = 0; i < N.length; i++) {
        sum += N[i]
        min = Math.min(N[i], min)
      }
      if (min > V) return V
      let cx = V - sum
      if (cx >= 0) {
        return cx
      } else {
        return subsets(N,V)
      }

};
var subsets = function (nums, target) {
      let res = [], len = nums.length;
      for (let i = 0; i < (1 << len); i++) {
        let arr = [];
        for (let j = 0; j < len; j++) {
          if (i & (1 << j)) arr.push(nums[j]);
        }
        res.push(arr);
      }
      let min = 9999
      for (let i = 0; i < res.length; i++) {
        let sum = 0
        for (let j = 0; j < res[i].length; j++) {
          if(res[i][j]<target||res.length==1){
            sum += Number.parseInt(res[i][j])
          }
        }
        let cx = Math.abs(sum - target)
        if (cx == 0) {
          return 0
        } else {
          if (min > cx) {
            min = cx
          }

        }

      }
      return min;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值