• 软件部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. }
  • 相关阅读:
    【uni-app系列】uni-app之nvue使用
    C语言指针:多级指针
    深入了解Elasticsearch搜索引擎篇:倒排索引、架构设计与优化策略
    服务器数据恢复-服务器硬盘指示灯黄灯闪烁的数据恢复案例
    SD-WAN不断冲击传统WAN架构
    2022世界杯La‘eeb肖像,python海龟实现啦
    VS Code安装配置python、C/C++开发环境
    OSI参考模型
    c++builder 6.0 使用ado
    【C语言】-文件操作
  • 原文地址:https://blog.csdn.net/QDQE232/article/details/126297353