完全背包&多重背包问题(动态规划)

这篇具有很好参考价值的文章主要介绍了完全背包&多重背包问题(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

完全背包问题:

每个物品使用次数没有限制,与0-1背包的不同之处在于遍历背包的顺序是正序。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n, v;
    cin >> n >> v;
    vector<int> weight(n), values(n), dp(v+1, 0); // dp[j]:容量为j的背包的最大价值
    for(int i=0; i<n; i++){
        cin >> weight[i] >> values[i];
    }
    for(int i=0; i<n; i++){
        for(int j=weight[i]; j<=v; j++){ // j的取值比较关键
            dp[j] = max(dp[j], dp[j-weight[i]]+values[i]);
        }
    }
    cout << dp[v];
    return 0;
}

多重背包问题:

与完全背包的区别在于,每一种物品是有个数限制的,不能无限选择。这篇博客讲解的非常详细,可以参考学习:

多重背包问题---超详细讲解+优化(不懂你揍我)-CSDN博客文章浏览阅读2.1w次,点赞83次,收藏259次。多重背包我们其实可以看成为01背包和完全背包的组合。但是怎么组合的呢?也可以就把多重背包问题转换成01背包问题,我们一起来看看解题思路。1.状态表示DP问题我们先来看状态表示二维数组的表示,F[i][j]代表前 i 个物品中,背包容量为 j 时所能拿到的最大价值。然后我们就看如何把多重背包转换成01背包与完全背包。2.转换(1)转换为01背包我们知道,01背包问题指的是各个物品只有一件,但在多重背包问题中,我们每种物品有 Si 件。我们可以考虑将多个同种物品合成一件物品。.._多重背包https://blog.csdn.net/windfriendc/article/details/123892024

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n, v;
    cin >> n >> v;
    vector<int> weight(n), values(n), nums(n), dp(v+1, 0);
    for(int i=0; i<n; i++){
        cin >> weight[i] >> values[i] >> nums[i];
    }
    for(int i=0; i<n; i++){ // 先遍历物品
        if(nums[i]*weight[i] >= v){ // 如果nums[i]*weight[i] >= v,则可以转换为完全背包问题
            for(int j=weight[i]; j<=v; j++){ // 完全背包要正序遍历
                dp[j] = max(dp[j], dp[j-weight[i]]+values[i]);
            }
        }else{ // 否则转换为0-1背包问题
            for(int j=v; j>=weight[i]; j--){ // 0-1背包要倒序遍历
                for(int k=nums[i]; k>=0; k--){ // 每件物品有k的数量限制
                    if(j >= k*weight[i])
                        dp[j] = max(dp[j], dp[j-k*weight[i]]+k*values[i]);
                }
            }
        }
    }
    cout << dp[v];
    return 0;
}

多重背包问题的二进制优化:

假设我们想要拿1024件物品,按照转化成0-1背包的方法做,我们需要从拿1件枚举到拿1024件。而二进制优化则是利用倍增思想,把拿多少件物品分为拿1、2、4、8、16、...、256、512、...、件,枚举的时候10次就到1024件了。基于上述思想,无论是多少件,总能用一些数的组合来表示,比如15(二进制形式:1111)就可以用8 + 4 + 2 + 1来表示,只需要枚举4次。这就是二进制优化的思想。

解题思路:将1、2、4...的物品分别保存下来它们的重量和价值,然后转化为0-1背包问题。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N, V;
    cin >> N >> V;
    vector<int> s(N), v(N), w(N), dp(V+1, 0);
    vector<int> biV, biW; // 合成的新物品体积和价值
    
    for(int i=0; i<N; i++){
        cin >> v[i] >> w[i] >> s[i];
        for(int k=1; k<=s[i]; s[i]-=k, k*=2){ // 用k取遍物品i所有个数,这里的 s[i]-=k, k*=2 顺序不能变,否则会出错
            biV.push_back(k*v[i]);
            biW.push_back(k*w[i]);
        }
        if(s[i] > 0){
            biV.push_back(s[i]*v[i]);
            biW.push_back(s[i]*w[i]);
        }
    }
    
    for(int i=0; i<biV.size(); i++){ // 转换成0-1背包
        for(int j=V; j>=biV[i]; j--){
            dp[j] = max(dp[j], dp[j-biV[i]]+biW[i]);
        }
    }
    cout << dp[V];
    return 0;
}

以上代码均为测试用的样例代码,实际问题需要根据题目要求进行修改。文章来源地址https://www.toymoban.com/news/detail-846919.html

到了这里,关于完全背包&多重背包问题(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法日志】动态规划刷题:01背包问题,多重背包问题(day37,day38)

    目录 前言 目标和(01背包) 一和零(01背包) 零钱兑换(多重背包) 排列总和(多重背包) 这两天都是背包问题,其中的01背包的一些应用问题需要一定的数学建模能力,需要i将实际问题简化成我们熟悉的背包问题;而这两天的多重背包问题还算比较基础,但也要我明白了

    2024年02月11日
    浏览(56)
  • 算法系列--动态规划--背包问题(3)--完全背包介绍

    💕\\\"Su7\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(3)–完全背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(3)--完全背包介绍 链接: 完全背包 可以发现完全背包问题和01背包问题还是特比相似的 分析: 完全背包问题 是 01背包问题 的推广

    2024年04月25日
    浏览(44)
  • 力扣刷题-动态规划算法3:完全背包问题

    问题描述: 1)有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 2) 每件物品都有无限个(也就是可以放入背包多次) (比0-1背包多出的条件) 3) 求解将哪些物品装入背包里物品价值总和最大。 求解步骤: 1)首先遍历物品,然

    2023年04月13日
    浏览(58)
  • 动态规划:完全背包问题----中专生刷算法

    需要基础:闫氏dp分析法,01背包问题 先去看一下01背包问题,再看完全背包 动态规划:选择dp及优化01背包问题-CSDN博客 做过01背包问题的同学会发现,完全背包问题的代码 在01背包基础上改动很小,但是里面的思想,有很大差距 题目 有 N 种物品和一个容量是 V的背包,每种物品

    2024年04月16日
    浏览(47)
  • 算法套路十四——动态规划之背包问题:01背包、完全背包及各种变形

    如果对递归、记忆化搜索及动态规划的概念与关系不太理解,可以前往阅读算法套路十三——动态规划DP入门 背包DP介绍:https://oi-wiki.org/dp/knapsack/ 0-1背包:有n个物品,第i个物品的体积为w[i],价值为v[i],每个物品至多选一个, 求体积和不超过capacity时的最大价值和,其中i从

    2024年02月10日
    浏览(59)
  • 动态规划DP之背包问题3---多重背包问题

    目录 DP分析: 优化:  二进制优化 例题:         01背包是每个物品只有一个,完全背包问题是每个物品有无限个。         那么多重背包问题就是 每个物品有有限个 。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解

    2024年03月20日
    浏览(49)
  • 力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

    力扣题目:#518.零钱兑换II(完全背包组合问题) 刷题时长:7min 解题方法:动态规划(完全背包) 复杂度分析 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 空间复杂度: O(m) 问题总结 对递推公式的理解 本题收获 题意转换:纯完全背包是凑成背包最大价值是多少,而本

    2024年02月13日
    浏览(41)
  • 动态规划-背包问题-完全背包

    对比01背包,完全背包中的每件物品有无数件。 也就是说,每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i种物品,体积为j时的最大价值 对于第i件物品: 不拿:dp[i][j]⇐dp[i-1][j] 拿一件:dp[i][j]⇐dp[i-1][j-w[i]]+v[i] 拿两件:dp[i][j]⇐dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]⇐dp[i

    2024年04月08日
    浏览(49)
  • 动态规划之背包问题——完全背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题——01背包 动态规划之背包问题——完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 算法(Java)——动态规划 2 数组 算法分析之数组问题 3 链表 算法

    2024年02月03日
    浏览(63)
  • 算法竞赛必考算法——动态规划(01背包和完全背包)

    1.1题目介绍 1.2思路一介绍(二维数组) 代码如下: 1.3思路二介绍(一维数组) 空间优化   为什么可以使用一维数组?   我们先来看一看01背包问题的状态转移方程,我们可以发现 f[i]只用到了f[i-1],其他的是没有用到的,我们可以用滚动数组来做。   还有一个原因就是我

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包