当前位置: 首页 > news >正文

背包初步练习

本篇主要更新AcWing上的两道例题:

11. 背包问题求方案数 - AcWing题库

12. 背包问题求具体方案 - AcWing题库

背包问题求方案数

思路

本题与01背包的模板类型基本一致,具体略有不同。

  • 初始化:每个体积下都至少有一个方案:它自己
  • 更新方案
    • 如果加上此物品变得比之前大就继承之前的值和方案数
    • 如果和之前的一样就加上此时的方案数和 j-v 的方案数
  • 遍历整个价值数组找到最大价值
  • 找到最大价值中方案数最多的
  • 注意:题目条件是“不超过”背包容量,并不是刚好等于背包容量

代码

void solve()//注意:本题是“不超过”容量
{cin >> n >> m;for(int i=0; i<=m; i++) an[i]=1;//当前体积下的方案数for(int i=1; i<=n; i++){cin >> v >> w;for(int j=m; j>=v; j--){int val=f[j-v]+w;//当前体积下的价值if(val>f[j]){f[j]=val;an[j]=an[j-v];//在体积j-v的基础上更新的价值}else if(val==f[j])//一样的话两个情况都指向这一个an[j]=(an[j]+an[j-v])%mod;}}int maxx=INT_MIN;int ans=0;for(int i=0; i<=m; i++)maxx=max(maxx,f[i]);for(int i=0; i<=m; i++)if(f[i]==maxx) ans=max(an[i],ans);cout<<ans;
}

背包问题求具体方案

思路

本题思路和原来背包不太相同,需要外层进行倒序遍历并正序查找

  • 由于正向查找的方案基于i−1i-1i1递推只是iii之前的最优方案而不是所有的最佳方案,所以我们逆向遍历
  • 还有就是在判断的时候由于要字典序最小,所以必须正着判断
  • 那么现在倒着遍历的话就不能在i−1i-1i1的基础上进行递推了,i+1i+1i+1才是它的上一个状态
  • 递推式:dp[i][j]=max(dp[i+1][j],dp[i+1][j−v[i]]+w[i]);dp[i][j]=max(dp[i+1][j],dp[i+1][j-v[i]]+w[i]);dp[i][j]=max(dp[i+1][j],dp[i+1][jv[i]]+w[i]);

代码

void solve()
{cin >> n >> m;for(int i=1; i<=n; i++) cin >> v[i] >> w[i];for(int i=n; i>=1; i--){for(int j=0; j<=m; j++){dp[i][j]=dp[i+1][j];//由于是倒着遍历,所以继承i+1的方案if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i+1][j-v[i]]+w[i]);}}for(int i=1,j=m; i<=n; i++)//此时决定是否要选{if(j>=v[i]&&dp[i+1][j-v[i]]+w[i]>=dp[i+1][j]){cout << i << ' ';j-=v[i];}}
}

背包问题确实是灵活多变,仅仅掌握模板远远不够。即使是趁着刚刚学完模板的这段时间来写这些题仍然比较吃力,希望能在这周剩下的时间对背包问题的理解更进一步。

http://www.lryc.cn/news/611279.html

相关文章:

  • 计算机视觉面试保温:CLIP(对比语言-图像预训练)和BERT技术概述
  • Linux逻辑卷管理操作指南
  • 论文解读:Mamba: Linear-Time Sequence Modeling with Selective State Spaces
  • JSP相关Bug解决
  • AutoSar AP LT规范中 建模消息和非建模消息都可以使用LogInfo() API吗?
  • 达芬奇31-40
  • stm32F407 硬件COM事件触发六步换相
  • AI赋能复合材料与智能增材制造:前沿技术研修重磅
  • 智能融合:增材制造多物理场AI建模与工业应用实战
  • 【面向对象】面向对象七大原则
  • linux nfs+autofs
  • 注意点:Git 从安装到分支协作、冲突解决的完整步骤 ---待修改,没看这个步骤,需要重新整理步骤
  • ara::log::LogStream::WithTag的概念和使用案例
  • 跨域场景下的Iframe事件监听
  • Nature Neuroscience | 如何在大规模自动化MRI分析中规避伪影陷阱?
  • Android 开发中,HandlerThread、IntentService 和 AsyncTask区别对比
  • 性能测试终极指南:从指标到实战
  • 《传统企业如何借助数字化转型实现企业增长》
  • 机器学习通关秘籍|Day 03:决策树、随机森林与线性回归
  • 分布式微服务--Nacos持久化
  • Python-机器学习初识
  • 机器学习——集成学习(Ensemble Learning):随机森林(Random Forest),AdaBoost、Gradient Boosting,Stacking
  • 论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》
  • 2.4 组件通信
  • 高阶 RAG :技术体系串联与实际落地指南​
  • 计算机网络 第2章通信基础(竟成)
  • PYQT的QMessageBox使用示例
  • 深入理解 Ext 系列文件系统:从磁盘物理到文件系统原理
  • 注意点:如何使用conda创建虚拟环境并使用虚拟环境以及当安装相关库时,如何指定安装到那个环境里面 ---待看
  • LINUX-进程管理及基础管理