JavaScript算法42- K 件物品的最大和(leetCode:2600easy)周赛

Posted Y_soybean_milk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript算法42- K 件物品的最大和(leetCode:2600easy)周赛相关的知识,希望对你有一定的参考价值。

2600. K 件物品的最大和

一、题目

袋子中装有一些物品,每个物品上都标记着数字 10-1
给你四个非负整数 numOnesnumZerosnumNegOnesk
袋子最初包含:

  • numOnes 件标记为 1 的物品。
  • numZeroes 件标记为 0 的物品。
  • numNegOnes 件标记为 -1 的物品。
    现计划从这些物品中恰好选出 k件物品。返回所有可行方案中,物品上所标记数字之和的最大值。

示例

输入:numOnes = 3, numZeros = 2, numNegOnes = 0, k = 2
输出:2
解释:袋子中的物品分别标记为 1, 1, 1, 0, 0 。取 2 件标记为 1 的物品,得到的数字之和为 2 。
可以证明 2 是所有可行方案中的最大值。

提示:

  • 0 <= numOnes, numZeros, numNegOnes <= 50
  • 0 <= k <= numOnes + numZeros + numNegOnes

二、题解

解法1(初级)

  • 思路:先取完标记为1的物品,再取0,最后取-1
  • 步骤
    • 生成一个包含所有物品的数组,数组从大到小排序 如[1,1,1,0,-1,-1…]
    • 数组的前K位的累加值,即为返回值
/**
 * @param number numOnes
 * @param number numZeros
 * @param number numNegOnes
 * @param number k
 * @return number
 */
var kItemsWithMaximumSum = function(numOnes, numZeros, numNegOnes, k) 
    let itemList = [];
    itemList = [...new Array(numOnes).fill(1),...new Array(numZeros).fill(0),...new Array(numNegOnes).fill(-1)];
    let sum = 0;
    for(let i = 0; i <k; i++)
        sum = sum + itemList[i]
    
    return sum;
;


。。 性能不太行呀,看看其它大神的解答

解法2(推荐)

  • 不必列出每个物品的标记
  • 利用二维数组
/**
 * @param number numOnes
 * @param number numZeros
 * @param number numNegOnes
 * @param number k
 * @return number
 */
var kItemsWithMaximumSum = function (numOnes, numZeros, numNegOnes, k) 
    let itemArray = [[1, numOnes], [0, numZeros], [-1, numNegOnes]];
    let sum = 0;
    for (let [val, count] of itemArray) 
        let selectNum = Math.min(count, k);
        k -= selectNum;
        sum += selectNum * val;
        if (k <= 0) return sum;
    
    return sum;
;


性能显著提升~

三、拓展 for…of

遍历二维数组及解构数组元素

let iterable = [["a", 1,11], ["b", 2,22]];

for (let entry of iterable) 
  console.log(entry);


for (let [val1, val2,val3] of iterable) 
  console.log(val1);
  console.log(val2);
  console.log(val3);  


> Array ["a", 1, 11]
> Array ["b", 2, 22]
> "a"
> 1
> 11
> "b"
> 2
> 22

0-1背包(动态规划)

1、题目描述:

   有 n 件物品和一个最大承重为 W 的背包,每件物品的重量是 ??i、价值是 ??i

  • 在保证总重量不超过 W 的前提下,选择某些物品装入背包,背包的最大总价值是多少?

注意:每个物品只有 1 件,也就是每个物品只能选择 0 件或者 1件。

  • 假设 values 是价值数组,weights 是重量数组
  • 编号为 k 的物品,价值是 values[k],重量是 weights[k],k ∈ [0, n)

2、思路:

(1)定义状态:假设 dp(i, j) 是 最大承重为 j、有前 i 件物品可选 时的最大总价值,i ∈ [1, n],j ∈ [1, W]

(2)状态转移方程:

?如果 j < weights[i – 1],那么 dp(i, j) = dp(i – 1, j)

?如果 j ≥ weights[i – 1],那么 dp(i, j) = max { dp(i – 1, j), dp(i – 1, j – weights[i – 1]) + values[i – 1] } 

(3)初始值:

?dp(i, 0)、dp(0, j) 初始值均为 0

(4)最终结果:

dp[values.length][capacity]

技术图片

3、代码:

 

以上是关于JavaScript算法42- K 件物品的最大和(leetCode:2600easy)周赛的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包(动态规划)

算法模板-01背包

算法基础背包

背包问题,贪心算法实现

多重背包

考虑下述背包问题的实例。有5件物品,背包容量为100。