【笔记】动态规划(1)---01背包和完全背包

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


动态规划

状态表示

集合:选法集合
属性:最优选择

状态计算

集合的划分


一、背包问题

01背包问题

#include<iostream>
using namespace std;

const int N=1010;
int v[N],w[N];
int f[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)    cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++)
        for(int j=m;j>=v[i];j--){
            //f[i][j]=f[i-1][j];仅仅是个赋值语句 在v[i]>j时保持更新。
            //显然,f[j]=f[j]中右侧的f[j]是i-1中的f[j]。
            f[j]=max(f[j],f[j-v[i]]+w[i]);
            // if(j>=v[i])  f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);这里f[i-1][j]也可以写成f[i][j]。
            // 若从大到小遍历j,那么对于k<j,f[k]都是第i-1次遍历时的状态,max(f[j],f[j-v[i]]+w[i])等价。
        }
    cout<<f[m]<<endl;
    return 0;
}

状态表示

集合:所有只考虑第i个物品前的且总体积不大于j的所有选法
属性:在所有集和中,价值最大的选法

状态计算

集合的划分:总是在(第 i - 1个)状态最优时,计算第 i 个状态。

背包已经最优,故对于任意容积、前 i - 1个物品,背包总是足够满的

当前状态 f [ i ] [ j ] 总是 f [ i - 1 ] [ j ] 和 f [ i - 1 ] [ j - v [ i ] ] 更新而来。

  1. f[i][j]=f[i-1][j];,不管容积 j 够不够,第 i 个物品还没装进去,故价值直接赋值 i - 1 的最优状态下的价值。
  2. if(j<v[i]),v [ i ] 比每一个 j 都大,装不进去。
  3. if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);比较两种状态的价值,找出最优状态。
两种状态

(1)第 i 个物品被选择:

  • f[i][j]=f[i-1][j-v[i]]+w[i];由上一个最优状态( i - 1个物品,容积为 j - v [ i ]时的最大价值)更新而来。背包有空间,剩余容积足够,直接装入,价值更新。
  • 可以理解为一个原来价值最大的满背包,外接了第 i 个物品(白嫖的价值肯定最优)。

(2)第 i 个物品未被选择:

  • f[i][j]=f[i-1][j];,背包有空间,但剩余容积不够,装不进去,价值不变。
  • 对于每个物品 i,总可以找到一个对应的容积 j,将物品 i 装入并达到最优状态背包容积 v 却小于这个 j 。

完全背包问题

#include<iostream>
using namespace std;

const int N=1010;
int v[N],w[N];
int f[N];

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
        for(int j=v[i];j<=m;j++)
                f[j]=max(f[j],f[j-v[i]]+w[i]);//已经优化后,朴素算法需要三重循环。
    cout<<f[m]<<endl;
    return 0;
}

状态表示

集合:所有只考虑第i种物品前的且总体积不大于j的所有选法
属性:在所有集和中,价值最大的选法。

状态计算

集合的划分:总是在(第 i - 1种)状态最优时,计算第 i 个状态。

背包已经最优,故对于任意容积、前 i - 1种物品,背包总是足够满的

当前状态 f [ i ] [ j ] 总是 f [ i - 1 ] [ j ] 和 f [ i ] [ j - v [ i ] ] 更新而来。

  1. f[i][j]=f[i-1][j];,不管容积 j 够不够,第 i 种物品还没装进去,故价值直接赋值 i - 1 的最优状态下的价值。
  2. if(j<v[i]),v [ i ] 比每一个 j 都大,装不进去。
  3. if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);比较两种状态的价值,找出最优状态。
两种状态

(1)第 i 种物品被选择:

  • f[i][j]=f[i][j-v[i]]+w[i];。由f[i][j]=f[i-1][j-k*v[i]]+k*w[i];
    推导而来。
  • f[i][j]=max(f[i-1][j-k*v[i]]+k*w[i]);背包有空间,剩余容积足够,直接装入 k 个第i种物品,价值更新。
  • 推导:
    f[i][j-v[i]]=max(f[i-1][j-v],f[i-1][j-k*v[i]]+(k-1)*w[i]);
    f[i][j-v[i]]+w[i]=max(f[i-1][j-v]+w[i],f[i-1][j-k*v[i]]+k*w[i]);
    f[i][j-v[i]]+w[i]=max(f[i-1][j-k*v[i]]+k*w[i]);
    f[i][j]=f[i][j-v[i]]+w[i];

(2)第 i 种物品未被选择:

  • f[i][j]=f[i-1][j];背包有空间,但剩余容积不够,装不进去,价值不变。

只有这一段代码和01背包不同:

   for(int j=v[i];j<=m;j++)
            f[j]=max(f[j],f[j-v[i]]+w[i]);

原因是当前状态 f [ i ] [ j ] 总是 f [ i - 1 ] [ j ] 和 f [ i ] [ j - v [ i ] ] 更新而来 ,两种状态均是上一次更新的最优状态。文章来源地址https://www.toymoban.com/news/detail-788297.html

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

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

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

相关文章

  • 三十八、动态规划——背包问题( 01 背包 + 完全背包 + 多重背包 + 分组背包 + 优化)

    0 1 背包问题: 条件:N 个物品容量为 V 的背包,每件物品最多用 1 次,其中物品信息体积为 Vi,价值为 Wi。 目标:选出物品,使价值最大(不一定装满背包)。 特点:每件物品 最多只用 1 次 完全背包问题: 特点:每一件物品都有 无限个 多重背包问题: 特点:每个物品

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

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

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

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

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

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

    2023年04月13日
    浏览(40)
  • 代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

    说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢, dp数组代表什么呢 ? 初始化是什么 , 遍历方式又是什么 ,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 有人一提到背包问题就只会使用动态规划来

    2024年02月06日
    浏览(46)
  • 算法系列--动态规划--背包问题(1)--01背包介绍

    💕\\\"趁着年轻,做一些比较cool的事情\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(1)–01背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(1)--01背包介绍 背包问题是动态规划中经典的一类问题,经常在笔试面试中出现,是非常 具有区分度 的题

    2024年04月16日
    浏览(37)
  • 算法篇——动态规划 完全和多重背包问题 (js版)

    01 背包 问题和 完全背包 问题的不同点在于,所有的物品只能 使用一次 ,判断  哪些物品  装进背包里 物品价值和 最大;而 完全背包 问题中,所有物品都能 使用n次 ,判断 哪个物品 装 n 个进去 物品价值和 最大。 01 背包的递推公式是: 【当然先遍历物品还是背包的容量

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

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

    2024年04月27日
    浏览(33)
  • 【动态规划】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日
    浏览(52)
  • 算法分析与设计——动态规划求解01背包问题

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

    2024年02月04日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包