码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 软件部2022届讲课底稿------完全背包问题


    本文为软件部2022届讲课底稿,作者5月份的时候决定出国,遂卷绩点和英语去了,本文诸多疏漏请多包涵,毕竟不是专业算法选手。

    目录

    背包问题的背景是什么?

    完全背包问题的背景

    完全背包问题的分析

    朴素写法

    完全背包问题的优化(滚动数组) 


    背包问题的背景是什么?

    现在有一个背包,体积是v,给定一些物品,这些物品有他们各自的体积vi,也有他们各自的价值权重wi,想要找出怎么装背包,才可以使背包里物品的总价值最大。

    问题一:背包必须装满吗?

    答:不是。

    完全背包问题的背景

    现在手上有一个背包,给定 n 件物品,每件物品有无数个。物品 i 的重量是 wi,其价值为 vi,背包的容量为 C。问应如 何装入背包中的物品,使得装入背包中物品的总价值最大?

    问题二: 01背包和完全背包问题的区别?

    答:01背包问题中每件物品只可以选取一次,完全背包无限次。

    完全背包问题的分析

    问题三:完全背包问题中集合是怎么来进行划分的?

    答:“在前i件物品中选取,有一个容量为j的背包,这其中所有的装法”是一个集合,完全背包问题中以第i件物品选取数量的多少(0件,1件,2件,3件,4件........k件) ,如上图所示。

    问题三:完全背包问题的公式推导结果是什么?

    答:

    问题四:问题三中的代码很难写,怎么简化?

    答:可以利用公式进行等价替代,过程如下。

     

    y氏dp分析法:

    朴素写法

    利用之前已经推好的公式

    1. #include
    2. using namespace std;
    3. const int N=1005;
    4. int dp[N][N];
    5. int v[N],w[N];
    6. int n,m;
    7. int main()
    8. {
    9. cin>>n>>m;
    10. for(int i=1;i<=n;i++)
    11. {
    12. cin>>v[i]>>w[i];
    13. }
    14. for(int i=1;i<=n;i++)
    15. {
    16. for(int j=1;j<=m;j++)
    17. {
    18. dp[i][j]=dp[i-1][j];
    19. if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);
    20. }
    21. }
    22. cout<
    23. return 0;
    24. }

    完全背包问题的优化(滚动数组) 

    如上图,公式f[i][j-v[i]]是利用本层的来更新的,在滚动数组中需要用到最新更新的值,所以是正序循环更新滚动数组。 

    1. #include
    2. using namespace std;
    3. const int N=1005;
    4. int dp[N][N];
    5. int v[N],w[N];
    6. int n,m;
    7. int main()
    8. {
    9. cin>>n>>m;
    10. for(int i=1;i<=n;i++)
    11. {
    12. cin>>v[i]>>w[i];
    13. }
    14. for(int i=1;i<=n;i++)
    15. {
    16. for(int j=1;j<=m;j++)
    17. {
    18. dp[i][j]=dp[i-1][j];
    19. if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);
    20. }
    21. }
    22. cout<
    23. return 0;
    24. }
  • 相关阅读:
    Nginx 笔记(五)nginx+keepalived高可用集群(主从+双主)
    基于Python实现的负载均衡模拟(语言类综合项目实践)
    elasticsearch配置密码、docker数据迁移、IP白名单
    这个 人工智能学习路径靠谱吗?
    依赖项安全检测新利器:Scorecard API
    【OpenCV 图像处理 Python版】图像处理的基本操作
    实用篇-Nacos配置管理
    云之后,亚马逊云科技要为业界提供水和空气一样的安全防护
    【JVM】优化参数+优化工具+优化实例
    制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
  • 原文地址:https://blog.csdn.net/QDQE232/article/details/126297353
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号