• 多重背包


    多重背包

    N种物品和一个容量为W的背包, 第i种物品最多有nums[i]件可用 ,每件重量是weight[i],价值是value[i]。求解将哪些物品装入背包可使得这些物品的重量和不超过背包的容量,且价值总和最大。

    示例 1:

    输入:N = 4, W = 5, weight = [1,2,3,4], value = [2,4,4,5], nums = [3,1,3,2]
    输出:10

    解题思路

    仔细观察题目,会发现多重背包0-1背包完全背包的不同点在于每种物品的数量,0-1背包是每种物品只有1件,完全背包是每种无限件,而多重背包是每件有限件。

    其实将多重背包里面的每种物品展开就是01背包问题了。比如有s个物品a,那么就可以展开成a1,a2,...as,然后再用01背包的方法解决。或者把每种商品遍历的个数放在01背包里面再遍历一遍

    C++

    // 方法一:将每种物品展开
    class Solution {
    public:
        int multipleBackpake(vector<int> weight, vector<int> value, vector<int> nums, int bagsize) {
            // 将每种物品展开
            for (int i = 0; i < nums.size(); i++) {
                while (nums[i] > 1) {
                    weight.push_back(weight[i]);
                    value.push_back(value[i]);
                    nums[i]--;
                }
            }
            vector<int> dp(bagsize + 1, 0);
            for (int i = 0; i < weight.size(); i++) { //先遍历物品
                for (int j = bagsize; j >= weight[i]; j--) { //再倒序遍历背包
                    dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
                }
            }
            return dp[bagsize];
        }
    };
    ​
    //方法二:把每种商品遍历的个数放在01背包里面再遍历一遍
    class Solution1 {
    public:
        int multipleBackpake(vector<int> weight, vector<int> value, vector<int> nums, int bagsize) {
            vector<int> dp(bagsize + 1, 0);
            for (int i = 0; i < weight.size(); i++) { //遍历物品
                for (int j = bagsize; j >= weight[i]; j--) { //遍历背包
                    for (int k = 1; k <= nums[i] && j >= k * weight[i]; k++) { //物品数量,注意k是从1开始的
                        dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]);
                    }
                }
            }
            return dp[bagsize];
        }
    };

    JavaScript

    /**
     * @param {number[]} weight
     * @param {number[]} value
     * @param {number[]} nums
     * @param {number} bagsize
     */
    function multipleBackpake(weight, value, nums, bagsize) {
        const dp = new Array(bagsize + 1).fill(0);
        for (let i = 0; i < weight.length; i++) { //先遍历物品
            for (let j = bagsize; j >= weight[i]; j--) { //再倒序遍历背包
                for (let k = 1; k <= nums[i] && j >= k * weight[i]; k++) {
                    dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]);
                }
            }
        }
        return dp[bagsize];
    }

     

  • 相关阅读:
    k8s 1.20.x版本NFS动态存储配置
    移动互联安全扩展要求(一)安全物理环境
    云计算安全扩展要求(四)安全区域边界
    安全管理机构(二)人员配备
    安全管理机构(三)授权和审批
    移动互联安全扩展要求(五)安全运维管理
    工业控制系统安全扩展要求(二)安全通信网络
    CentOS搭建Git服务器及权限管理
    LAB10:节点健康状态
    物联网安全扩展要求(三)安全计算环境
  • 原文地址:https://www.cnblogs.com/wltree/p/15981177.html
Copyright © 2020-2023  润新知