[动态规划] 分组背包

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

[动态规划] 分组背包,算法

 开局思路 

        1.对dp[N] 的涵义进行定义

        2.递推公式

        3.初始化(此题不用)

        4.遍历

1.dp[i][j]的定义:从1 - n组的物品里 选出总体积不超过j的 总价值。

2地推公式:dp[i][j] = max(dp[i][j], dp[i-1][j - v[i][k]] + w[i][k]);

                [动态规划] 分组背包,算法如若装入遍历到的物品时最大值没发生变化则不变

                [动态规划] 分组背包,算法

                  v[i][k] : 第i组中第k个物品的体积

                  w[i][k]; 该物品的价值

                      

3. 略

4.先对组数 i 进行遍历, 后对背包容量遍历, 后对各个组中的 单个物品遍历,

    其中要判断 该物品是否放得进当前容量的背包。

``` c++

for(int i = 1; i <= n; i++){ 
        for(int j = m; j >= 0; j--){ //背包容量遍历
            for(int k =1; k <= s[i]; k++){
                if(j >= v[i][k]){//判断是否装得下

```文章来源地址https://www.toymoban.com/news/detail-832497.html

背包遍历从大到小的原因:

                                                dp[i][j] = max(dp[i][j], dp[i-1][j - v[i][k]] + w[i][j])

        可等同于                          dp[j] = max(dp[j], dp[j - v[i][k] + w[i][j])

        由去掉的下标知               a第i层       b第i层,  c第i -1层

        我们可以从下标知道 c比a先算出来 而a算的时候已经是第i层了。

        因此从小到大遍历时c已经不是第i-1层而是第i层,而倒着算(遍历)可以避免这个问题。

        

    最后遍历输出

```

#include<bits/stdc++.h>

using namespace std;

const int N =110;

int n, m, s[N];
int dp[N], v[N][N], w[N][N];

int main(){
    cin >> n >> m;
    
    for(int j = 1; j <= n; j++){
        cin >> s[j];
        for(int i = 1; i <= s[j]; i++){
            scanf("%d%d",&v[j][i],&w[j][i]);
        }
    }
    
    
    // dp[i][j] = max(dp[i][j], dp[i-1][j-v[i][k]] + w[i][k])
    
    // dp[j] = max(dp[j], dp[j - v[i][k] + w[i][k]) 上一层为 i-1 从大到小排 
    for(int i = 1; i <= n; i++){
        for(int j = m; j >= 0; j--){
            for(int k =1; k <= s[i]; k++){
                if(j >= v[i][k]){
                    dp[j] = max(dp[j],dp[j - v[i][k]] + w[i][k]);
                }
            }
        }
    }
    
    cout << dp[m];
    
    return 0;
}

```

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

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

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

相关文章

  • 算法学习笔记(动态规划——01背包)

    先来聊聊动态规划,动态规划是分治法的一种体现,把一个问题分解成若干个子集,通过当前状态,经过操作得到下一个状态,最后得到最优问题解的一种方法。 步骤: 设定状态,保存状态 根据状态设定转移方程 确定边界 其中的01背包解决的是关于选择的动态规划问题,

    2024年03月25日
    浏览(40)
  • 【算法-动态规划】0-1 背包问题

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月08日
    浏览(37)
  • C++ DP算法,动态规划——背包问题(背包九讲)

    有N件物品和一个容量为 V V V 的背包。放入第i件物品耗费的空间是 C i C_i C i ​ ,得到的价值是 W i W_i W i ​ 。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即 F [ i , v ] F[i, v] F

    2024年02月16日
    浏览(37)
  • 算法学习17-动态规划01:背包问题

    提示:以下是本篇文章正文内容: 提示:这里对文章进行总结: 💕💕💕

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

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

    2024年02月10日
    浏览(41)
  • 背包问题算法全解析:动态规划和贪心算法详解

    计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。 背包问题是一种经典的优化问题。有的时候我们需要将有一堆不同重量或者体积的物品放入背包,但是背包容量

    2024年02月09日
    浏览(39)
  • 【动态规划】01背包问题——算法设计与分析

    若超市允许顾客使用一个体积大小为13的背包,选择一件或多件商品带走,则如何选择可以使得收益最高? 商品 价格 体积 啤酒 24 10 汽水 2 3 饼干 9 4 面包 10 5 牛奶 9 4 0-1 Knapsack Problem 输入: quad - n n n 个商品组成集合 O O O ,每个商品有属性价格 p i p_i p i ​ 和体积 v i v_i v

    2024年02月04日
    浏览(53)
  • acwing算法基础之动态规划--背包问题

    (零) 背包问题描述:有 N N N 个物品,每个物品的体积是 v i v_i v i ​ ,价值是 w i w_i w i ​ ,现有容量是 V V V 的背包,求这个背包能装下的物品的最大价值。 01背包问题:每个物品只有1个。 完全背包问题:每个物品有无穷多个。 多重背包问题:第 i i i 个物品有 s i s_i s

    2024年02月05日
    浏览(37)
  • 【Python算法】实验12-动态规划与背包问题

    目录 实验内容 1.数塔dp -A 2.骨牌铺方格 3.一只小蜜蜂

    2024年02月15日
    浏览(32)
  • 算法分析与设计——动态规划求解01背包问题

    假设有四个物品,如下图,背包总容量为8,求背包装入哪些物品时累计的价值最多。 我们使用动态规划来解决这个问题,首先使用一个表格来模拟整个算法的过程。 表格中的信息表示 指定情况下能产生的最大价值 。例如, (4, 8)表示在背包容量为8的情况下,前四个物品的最

    2024年02月04日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包