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

动态规划疑惑总结

文章目录

  • 前言
  • 一、完全背包问题之组合问题---先物体再背包容量(背包)
    • 1.代码
    • 2.输出结果如下:
    • 3.现在我们来分析一下这个输出结果:
  • 二、完全背包问题之排列问题---先背包再物体
    • 1.代码
    • 2.输出结果如下:
    • 3.分析输出结果
  • 三、对比输出结果
  • 总结


前言

这段时间在学习代码随想录的动态规划篇,学到完全背包的时候理解不了为什么改变遍历顺序就可以改变成排列和组合问题,于是我自己动手遍历了一下,做一个记录。


一、完全背包问题之组合问题—先物体再背包容量(背包)

因为一维和二维思路都是差不多的,为了和下面的排列问题一一对应,这块就直接用一维的进行演示,代码如下:

1.代码

int combinationSum4(vector<int>& nums, int target) {int n = nums.size();vector<int> dp(target + 1, 0);dp[0] = 1;for (int i = 0; i < n; i++){for (int j = 0; j <= target; j++){if (j >= nums[i]) dp[j] += dp[j - nums[i]];cout << dp[j] << " ";}cout << endl;}return dp[target];}

2.输出结果如下:

组合问题输出结果

3.现在我们来分析一下这个输出结果:

输出结果分析
我们这里默认将新的元素加在集合的最后面,在排列方法中也是这样。

二、完全背包问题之排列问题—先背包再物体

1.代码

int arrangeSum4(vector<int>& nums, int target) {int n = nums.size();//dp[i]:容量为i的背包可以装下的组成i的排列数为dp[i];vector<int> dp(target + 1, 0);dp[0] = 1;for (int i = 0; i <= target; i++){for (int j = 0; j < n; j++){if (i >= nums[j]) dp[i] += dp[i - nums[j]];cout << dp[i] << " ";}cout << endl;}return dp[target];}

2.输出结果如下:

排列问题输出结果

3.分析输出结果

输出结果分析
上面我们也说了,每次添加的时候会将新加入的元素放在最后面(同意放在最前面也是可以的哈)。

三、对比输出结果

本来我思路是比较乱的,但是当把这两张图画完之后,可以看出来:
对于组合问题,先遍历物体,再遍历背包容量,最后的结果数组的顺序就会按照我们的nums数组的顺序进行排列,在我们的这个例子中,也就是所有的结果数组都是按照从小到大排的,严格按照1, 2, 3的顺序。
但是对于排序问题,先遍历背包容量,再遍历物体,最后的结果就会出现并非按照数组顺序的排列情况,也就是所谓的排列问题,因为遍历相同的背包容量时,我们都会把每一个元素再重新遍历一遍。


总结

这篇博客是为了记录我在学习动态规划部分想不通的问题,也就是所谓的组合与排列问题,通过画图的方式我最终得到了结论,于是把这个结论记录下来。

http://www.xdnf.cn/news/1098361.html

相关文章:

  • Ajax之核心语法详解
  • OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析
  • 安全访问云端内部应用:用frp的stcp功能解决SSH转发的痛点
  • 【Nginx】Nginx 安装与 Sticky 模块配置
  • 使用Docker将Python项目部署到云端的完整指南
  • 网络安全(初级)(1)
  • 显卡GPU的架构和工作原理
  • QT Android 如何打包大文件到目录下?
  • Android ViewBinding 使用与封装教程​​
  • 【数据结构与算法】数据结构初阶:动态顺序表各种方法(接口函数)复盘与整理
  • 模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
  • uniapp滚动组件, HuimayunScroll:高性能移动端滚动组件的设计与实现
  • 深入理解oracle ADG和RAC
  • 【大模型推理论文阅读】Enhancing Latent Computation in Transformerswith Latent Tokens
  • 毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线
  • 无人机抗风模块运行与技术难点分析
  • AI 智能体:开启自动化协作新时代
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程
  • UE5源码模块解析与架构学习
  • Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
  • 大健康IP如何借“合规创新”抢占行业新风口|创客匠人
  • 创始人IP如何进阶?三次关键突破实现高效转化
  • Windows 11 安装过程中跳过微软账户创建本地账户
  • TCP传输控制层协议深入理解
  • Apache http 强制 https
  • 征程 6M 部署 Omnidet 感知模型
  • 正向代理服务器Squid:功能、架构、部署与应用深度解析
  • 基于 Flutter 的开源文本 TTS 朗读器(支持 Windows/macOS/Android)
  • 防爬虫君子协定 Robots.txt 文件
  • 微软云语音识别ASR示例Demo