动态规划模板总结(1)

news2024/11/22 21:33:35

动态规划思想(1)


背包问题

​ 分类:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZiRTbMOi-1668940619398)(C:\Users\44110\AppData\Roaming\Typora\typora-user-images\image-20221118190636657.png)]


01 背包问题

  • 含义:每个物体最多选1次,在不超过总体积的情况下价值最大
  • 图解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOlFCDpU-1668940619399)(C:\Users\44110\AppData\Roaming\Typora\typora-user-images\image-20221118194320380.png)]

  • f(i,j)表示的是集合的某种属性,是个值。

  • 集合是所有选法

  • i 只从前i个中选

  • 朴素实现

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    int n,m;//n代表物品个数m代表容量
    int v[N],w[M];//v代表体积,w代表价值
    int f[N][N];//全局变量默认为0
    
    int mian(){
    	cin >> n >> m;
    	for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];
    	//for[0][0~m]//考虑0件物品,最大价值不超过0~m  但默认为0所以可以不写
    	for(int i = 1; i <= n; i++)
    		for(int j = 0; j <= m; j++){//j代表体积
    			f[i][j] = f[i-1][j]//代表左边不含i的情况
    			if(j >= v[i])//如果第i件物品体积大于背包就装不下了
    				f[i][j] = max(f[i][j],f[i-1][j-v[i]] + w[i]);
    		}
    		
    		cout << f[n][m] << endl;
    		
    		return 0;
    }
    
    • 一维实现

      
      #include<iostream>
      #include<algorithm>
      
      using namespace std;
      
      const int N = 1010;
      
      int n,m;//n代表物品个数m代表容量
      int v[N],w[M];//v代表体积,w代表价值
      int f[N];//全局变量默认为0
      
      int main(){
          	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[j] = max(f[j],f[j-v[i]] + w[i]);
          cout << f[m] << endl;
          return 0;
      }
      
  • 滚动数组:如果f()只用到了上层的数据,完全可以只用f(2)和f(1)交替来算。不需要创建额外的空间。

  • 一维实现:运用了滚动数组的思想,每次找最大值就是从前面一次的数组寻值,而且由于公式的原因不可能从原地址取值。运用了一维就可以直接把前面i代表的那一维去掉


02完全背包问题

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NsMSQYGG-1668940619400)(C:\Users\44110\AppData\Roaming\Typora\typora-user-images\image-20221119222938423.png)]

  • 朴素实现

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    int n,m;
    int v[N],W[N];
    int f[N][N];
    
    int main(){
    	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 = 0; j <= m; j++)
                for(int k = 0; k*v[i] <= j;k++)
                    f[i][j] = max(f[i][j],f[i-1][j - v[i]*k] + w[i] * k);
        
        cout << f[n][m] << endl;
    
    }
    

    优化思路:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1yhjJnh-1668940619400)(C:\Users\44110\AppData\Roaming\Typora\typora-user-images\image-20221119224101349.png)]

  • 代码

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    int n,m;
    int v[N],W[N];
    int f[N][N];
    
    int main(){
    	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 = 0; j <= m; j++)
            {
                f[i][j] = f[i-1][j];
                if(j >= v[i]) f[i][j] = max(f[i][j],f[i][j-v[i]] + w[i])//
            }
        cout << f[n][m] << endl;
    
    }
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bnxrobhy-1668940619400)(C:\Users\44110\AppData\Roaming\Typora\typora-user-images\image-20221119225212294.png)]

  • 和01背包问题比较,可以看出还能继续优化
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1010;

int n,m;
int v[N],W[N];
int f[N];

int main(){
	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[i][j] = max(f[j],f[j-v[i]] + w[i]);
    cout << f[m] << endl;

}

; i <= n; i++) cin >> v[i] >> w[i];

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

}


- 01背包问题从小到大,完全背包是从大到小。为什么01和完全只差个顺序呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch是什么?ElasticSearch在SpringBoot中怎么用?SpringBoot整合ElasticSearch

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.4.3.4 ElasticSearch(ES) 3.4.3.4.1 介绍 是一个…

MySQL JDBC编程

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;MySQL &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 文章目录前置知识APIJDBC的使用安装数据库代码插入操作查找操作前置知识 API API(Application Program Interface)被定义为应用程…

金属纳米颗粒图像分割和计数

代码下载链接&#xff0c;直接上程序运行的效果&#xff1a; 为了便于大家学习&#xff0c;把原图也都贴上了&#xff1a;

乐趣国学—品读《弟子规》中的“亲仁”之道

文章目录亲仁同是人 类不齐 流俗众 仁者希果仁者 人多畏 言不讳 色不媚能亲仁 无限好 德日进 过日少不亲仁 无限害 小人进 百事坏亲仁 “亲仁”&#xff0c;亲是亲近、学习的意思&#xff0c;亲近那些有道德、有学问、有人生境界、有情操的人&#xff0c;这是讲择师。一个人的学…

【Redis】配置项与发布订阅

一、配置项 redis相关配置项都存放在redis.conf文件中&#xff0c;暂时只列举常见的几个&#xff0c;其余的工作中用到再回来更新 1、网络 bind&#xff1a;指定redis只能接受来自此IP绑定的网卡的请求&#xff0c;注意此默认值默认外网是不可访问的&#xff0c;如果想要开启…

Unity3D制作塔防类游戏

演示 功能简介 制作细节详解 演示 资源包:链接&#xff1a;https://pan.baidu.com/s/15MMtYeKkNk5xChvCx0EckQ?pwdd1ub 提取码&#xff1a;d1ub 对应视频教学:01-开始介绍和创建工程_哔哩哔哩_bilibili 功能简介 分为蓝&#xff0c;紫&#xff0c;粉&#xff0c;红四…

[iOS]UI分析工具Reveal

Reveal是ITTY BITTY发布的UI分析工具&#xff0c;可以很直观的查看App的UI布局。 去官网下载安装Reveal&#xff0c;启动后样式如下。 下面介绍一下如何在非越狱设备和越狱设备上用Reveal工具分析UI 一、非越狱设备用Reveal分析UI 1.安装MonkeyDev 安装流程可查看前文[iOS]…

2. Java线程模型

1. 操作系统线程 无论使用何种编程语言编写多线程程序&#xff0c;最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。 线程有多种实现方式&#xff0c;常见的有&#xff1a;内核线程、用户线程、混合线程。 不同线程模型的主要区别在于线程的调度方不…

bat脚本启动Java服务

bat脚本启动Java服务1.终端cmd窗口运行jar2. bat脚本启动jar包3.后台启动bat脚本4. 运行bat只启动一次jar服务及停止脚本5.注意事项6.所用资源1.终端cmd窗口运行jar Java项目一般会被打包成jar后启动&#xff0c;在windows系统中可以通过终端窗口cmd启动jar包&#xff0c;即在…

5G无线技术基础自学系列 | 移动通信网络的架构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 第五代(5thGeneraton&#xff0c; 5G) …

计算机中的第一个伟大发明(IR/IAR)

计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性&#xff0c;那么在其中有哪些举足轻重的发明呢&#xff1f;本节我们来了解一下计算机中第一个伟大的发明&#xff1a;指令寄存器和指令地址寄存器 回顾在步进器加持下的两数两加 前面提到两个数相加的执行…

PyCharm运行PyQT6 (四) 百篇文章学PyQT

本文章是百篇文章学PyQT的第四篇&#xff0c;本文讲述如何使用PyCharm成功运行PyQT6&#xff0c;PyCharm在配置过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决…

Intel芯片、AMD显卡有多强?M1系列呢?

我们知道英特尔是半导体行业和计算创新领域的全球领先厂商 &#xff0c;创始于1968年。如今&#xff0c;英特尔正转型为一家以数据为中心的公司 。英特尔与合作伙伴一起&#xff0c;推动人工智能、5G、智能边缘等转折性技术的创新和应用突破 &#xff0c;驱动智能互联世界。…

【由浅入深 - Java笔记】玩转List:List过滤和筛选

文章目录List过滤&#xff1a;Comparator、Comparable 和 Stream1. 使用list的Stream进行筛选2. 增强for循环遍历元素&#xff0c;进行筛选3. 使用list.foreach遍历4. 使用iterator遍历5. 视频笔记List过滤&#xff1a;Comparator、Comparable 和 Stream 花时间精力去凿许多浅井…

5G无线技术基础自学系列 | 移动通信网络的演进

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 随着移动用户数量的不断增加&#xff0…

mac系统安装搭载Windows系统虚拟机方法教程

我们都知道macOS系统虽然相对windows系统而言更稳定&#xff0c;但macOS系统中可使用的软件数量较windows系统而言要少很多。对于macOS系统应用少的问题&#xff0c;我们可以使用虚拟机来解决。那么&#xff0c;苹果虚拟机好用吗&#xff1f;整体而言是可以的。苹果虚拟机怎么装…

0-搭建nodejs环境

1) 安装 nvm nvm 即 (node version manager)&#xff0c;好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时&#xff0c;一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国内镜像地…

小马哥的CSS驿站

目录 第一章 CSS概述 1.1语法 1.2注释 1.3CSS的创建 第二章 CSS选择器 1.id选择器 2.class选择器 3.标签选择器 4.子代选择器 5.后代选择器 6.相邻兄弟选择器 7.后续兄弟选择器 8.交集选择器 9.并集选择器 第三章 CSS样式 1.文本与文字样式 &#xff08;1&…

G2O学习 - 曲线拟合实例

学习使用G2O进行曲线拟合使用 1. 拟合目的&#xff0c;如何建立拟合的图模型 大概就是曲线拟合&#xff0c;求曲线 y ax^2 bx c 中 abc 的值。 但是我一直不明白如何获得下面图的。 我觉得应该是这样的 首先把abc视为一个变量&#xff0c;这个变量应该是一个矩阵【这里还…

Python和Pycharm安装教程

一、Python安装 1.进入官网下载Python 官网地址&#xff1a;Download Python | Python.org 官网下载可能会有些慢&#xff0c;请耐心等待 我这里把3.11的安装包和后面的Pycharm安装包都放到网盘里面了 链接&#xff1a;https://pan.baidu.com/s/1spxNUbH4trWBox1SJeBjkQ?pwdh…