代码随想录算法训练营刷题复习1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习

在这里插入图片描述

一、01背包

  1. 416. 分割等和子集
  2. 1049. 最后一块石头的重量 II
  3. 494. 目标和
  4. 474. 一和零

416. 分割等和子集

class Solution {
public:bool canPartition(vector<int>& nums) {int sum=0;for(int i=0;i<nums.size();i++) {sum+=nums[i];}if(sum%2!=0)return false;vector<int> dp(sum/2+1,0);for(int i=0;i<nums.size();i++) {for(int j=sum/2;j>=nums[i];j--) {dp[j] = max(dp[j],dp[j-nums[i]]+nums[i]);}}if(dp[sum/2]==sum/2)return true;elsereturn false;}
};

1049. 最后一块石头的重量 II

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {//将所有的石头分为两堆,这两队的重量尽可能地相近,最后用这两堆的重量之差的绝对值来表示最后的结果int sum=0;for(int i=0;i<stones.size();i++) {sum+=stones[i];}int target = sum/2;   // /是向下取整, sum-target >= targetvector<int> dp(target+1,0);for(int i=0;i<stones.size();i++) {for(int j=target;j>=stones[i];j--) {dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]);}}return sum-dp[target] - dp[target];}
};

494. 目标和

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {//这个题,动规比较隐含,需要自己找一下这个背包容量(sum+target)/2;//所有元素的和为sum,x表示加法运算的和,减法背包的容量sum-x,target = x - (sum-x); 就得到了x的表达int sum=0;for(int i=0;i<nums.size();i++) sum+=nums[i];int x = (sum+target)/2;vector<int> dp(x+1,0);//这个初始条件很重要,当初始化为全零的时候结果为0dp[0]=1;for(int i=0;i<nums.size();i++) {for(int j=x;j>=nums[i];j--) {//这里这个问总和的题,需要用+=,//不复习有点忘了。dp[j] += dp[j-nums[i]];}}return dp[x];}
};

474. 一和零

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>>  dp(m+1,vector<int>(n+1,0));//先取出来字符串数组中的每个字符串for(string s : strs){//统计这个字符串中出现了多少个0和1int num_0=0,num_1=0;    for(char c : s) {if(c=='0')num_0++;else if(c=='1')num_1++;}for(int i=m;i>=num_0;i--) {for(int j=n;j>=num_1;j--) {dp[i][j] = max(dp[i][j], dp[i-num_0][j-num_1]+1);}}}return dp[m][n];}
};

二、完全背包问题

  1. 518 零钱兑换Ⅱ
    题目要求:符合 32 位整数范围;
  2. 377.组合总和Ⅳ
  3. 70 爬楼梯 完全背包问题版本
  4. 322.零钱兑换
  5. 279.完全平方数
    for循环中 j的界限从1开始
  6. 139.单词拆分
    这个题对unordered_set的使用以及dp[i]的更新还是不熟练

518 零钱兑换Ⅱ

class Solution {
public:int change(int amount, vector<int>& coins) {vector<int> dp(amount+1,0);//问组合数的问题,dp[0]初始化为1dp[0]=1;for(int i=0;i<coins.size();i++) {//完全背包问题,不要求仅出现一次,内层循环不用逆序for(int j=coins[i];j<=amount;j++) {//组合问题 +=dp[j] += dp[j-coins[i]];}}return dp[amount];}
};

377.组合总和Ⅳ

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {//排列问题vector<int> dp(target+1,0);dp[0] = 1;for(int i=0;i<=target;i++) {for(int j=0;j<nums.size();j++) {//排列问题://外层遍历 背包容量,内层遍历物品//要先判断这个背包容量和当前物品大小//以及满足:符合 32 位整数范围(不能超过INT_MAX)if(nums[j]<=i && dp[i] < INT_MAX-dp[i-nums[j]])dp[i] += dp[i-nums[j]];}}return dp[target];}
};

70 爬楼梯 完全背包问题版本

class Solution {
public:int climbStairs(int n) {//把这个问题看作是完全背包问题,1和2可以无限选择vector<int> dp(n+1,0);//问总数的,dp[0]初始化为1dp[0]=1;//最少上一层台阶for(int i=1;i<=n;i++) {//这里物品遍历选择只有1,2for(int j=1;j<=2;j++) {if(i-j>=0)//+=dp[i] += dp[i-j];}}return dp[n];}
};

322.零钱兑换

class Solution {
public:int coinChange(vector<int>& coins, int amount) {//找dp[amount]最小,初始化定义为INT_MAXvector<int> dp(amount+1,INT_MAX);//dp[0]的初始化需要修改为0,dp[0]=0;//这里不用考虑组合还是排列,这个遍历顺序就是正序就行for(int i=0;i<coins.size();i++) {for(int j=coins[i];j<=amount;j++) {if(dp[j-coins[i]]!=INT_MAX)dp[j] = min(dp[j],dp[j-coins[i]]+1);}}//如果凑不到这个总金额的话,这个值没有修改,就返回-1if(dp[amount]==INT_MAX)return -1;return dp[amount];}
};

279.完全平方数

class Solution {
public:int numSquares(int n) {vector<int> dp(n+1,INT_MAX);dp[0]=0;//外层遍历“背包”for(int i=0;i<=n;i++) {//内层,控制平方数不能大于i//j从0开始会报错:runtime error 发生溢出for(int j=1;j*j<=i;j++) {dp[i] = min(dp[i-j*j]+1,dp[i]);}}return dp[n];}
};

139.单词拆分

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {//unordered_set这个容器不熟悉//无序集合,值唯一,可使用find()函数来查找元素(在这里是查找单词)unordered_set<string> wordSet(wordDict.begin(),wordDict.end());vector<bool> dp(s.size()+1,false);dp[0]=true;//这里的处理逻辑:for(int i=1;i<=s.size();i++) {//这里的j实际上是从0开始找到第一个单词结束的末尾,然后把j- i-j这一段单词复制出来for(int j=0;j<i;j++) {string substr1 = s.substr(j,i-j);//这里这个dp[j]很关键,//找到上一个单词的结尾位置并且新单词也在字典中,才能为true;if(wordSet.find(substr1)!=wordSet.end() && dp[j])dp[i] = true;}}return dp[s.size()];}
};

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

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

相关文章

IP地址、子网掩码、网段、网关

前面相同就是在同一个网段 如果子网掩码和网络号相与的结果是一样的&#xff0c;那么他们就在同一个子网 IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?_掩码248可以用几个ip-CSDN博客

谷歌上架,APP被移除了,没封号,换个包名还能重新提审上架?

对于在Google Play上架应用的开发者来说&#xff0c;尤其是那些矩阵式上架马甲包的开发者&#xff0c;可能已经遭遇过无数次应用被暂停或移除的情况了。通常这种情况下&#xff0c;账号也随之会被封&#xff0c;且大多数开发者认为&#xff0c;没有立马收到封号邮件的话&#x…

基于scikit-learn的机器学习分类任务实践——集成学习

一、传统机器学习分类流程与经典思想算法简述 传统机器学习是指&#xff0c;利用线性代数、数理统计与优化算法等数学方式从设计获取的数据集中构建预测学习器&#xff0c;进而对未知数据分类或回归。其主要流程大致可分为七个部分&#xff0c;依次为设计获取数据特征集&#x…

【C++】stack、queue和deque的使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 一、stack 1. stack介绍 2. stack使用 二、queue 1. queue介绍 2. queue使用 三、deque 1. deque介绍 2. deque的…

【Pandas驯化-01】一文介绍 Pandas中的Dataframe和Series 区别

【Pandas】驯化-01一文介绍 Pandas中的Dataframe和Series 区别 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众…

第九届星华杯网络邀请赛

T1喵星人的身高 T2犇犇碑 T3嘤嘤词典 T4三角区间和

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

HBase中Master初始化错误~

ERROR&#xff1a;org.apache.hadoop.hbase.PleaseHoldException:Master is initializing 1、停止HBase运行 2、启动zookeeper中的zkCli.sh服务 ./zookeeper/bin/zkCli.sh 3、执行完毕显示以下结果,删除habse文件夹 4、重新启动HBase即可。

python-02

面向对象 Python中把具有相同属性和方法的对象归为一个类。 class ClassName: 语句 class Myclass: # 定义类Myclassdef pp(self): # 定义方法pp()print("这是产品说明书")myclass Myclass() # 实例化类Myclass myclass.pp() # 调用Myclass中的方法pp()打印…

《幻影大师:透视缠中说禅的虚像与真相》

而且他从不犯错&#xff0c;至少在他的叙述中是这样&#xff0c;所有的文章和言论都被粉饰得完美无瑕&#xff0c;即便有误&#xff0c;他也绝不公开承认&#xff0c;更别提什么真诚的道歉和改正了。那些对他推崇备至的人&#xff0c;多是盲目追随&#xff0c;将他神化为无所不…

《Nest系列 - 1. 运行一个Nest项目以及整体目录学习》

初识Nest心路历程 作为一名前端开发&#xff0c;说实话&#xff0c;学习Nest后端技术, 会有一定的成本。我试着阅读文档&#xff0c;安装项目&#xff0c;把项目跑起来&#xff0c; 当我看到久违的Hellow world 后&#xff0c;还来不及欣喜&#xff0c;就困惑了, 作为一个后端…

Java的集合框架总结

Map接口和Collection接口是所有集合框架的父接口&#xff1a; Collection接口的子接口包括&#xff1a;Set接口和List接口 Map接口的实现类主要有&#xff1a;HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有&#xff1a;HashSet、Tr…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1&#xff1a;详细步骤&#xff08;初始化与启动dfs服务&#xff09;详细步骤配置环境变量 服务2&#xff1a;Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

记录AE快捷键(持续补充中。。。)

记录AE快捷键 快捷键常用快捷键图层快捷键工具栏图层与属性常用指令视图菜单时间轴常规快捷键项目首选项功能摄像机操作 常用操作导入AI/PS工程文件加选一个关键参数快速回到上下一帧隐藏/显示图层关键帧拉长缩短关键帧按着鼠标左键不松手&#xff0c;在秒表那一列往下移动会都…

深度学习(PyTorch)批注理解,建议边学可以边看这个笔记

前言 动手学习深度学习&#xff0c;内容丰富&#xff0c;但是对于初学者有很多晦涩难懂的地方&#xff0c;我将日常更新这篇文章以截图的形式&#xff0c;每天高强度学习四五个小时&#xff0c;精力缺乏&#xff0c;我认为&#xff0c;如果想学习这个深度学习&#xff0c;你需…

ubuntu vnc

如何在Ubuntu 18.04安装VNC | myfreax sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt install tigervnc-standalone-server tigervnc-common vncserver sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt ins…

5.数据仓库与数据挖掘期末复习

ETL的含义Extract 、 Transformation、Load。ODS的全称Operational Data Store。 DW全称 Data WarehourseDM全称是Data Mart数据仓库数据抽取时所用到技术是增量、全量、定时、调度STAGE层作用是提供业务系统数据文件的临时存储ODS层作用ods提供业务系统细节数据长期沉淀MID层…

实用软件下载:BetterZip 5最新安装包及详细安装教程

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

057、PyCharm 运行代码报错:Error Please select a valid Python interpreter

当我们在PyCharm运行代码时&#xff0c;提示如下图错误&#xff1a; 那么问题通常是由于PyCharm未正确配置Python解释器引起的。 我们只需按以下步骤重新配置Python解释器即可&#xff1a; 打开PyCharm设置&#xff1a; 在菜单栏中的点击 “File” -> “Settings”&#xf…

选择性语言建模:下一代语言模型训练方法

在人工智能领域&#xff0c;语言模型的预训练方法一直是研究的热点。传统的语言模型预训练方法普遍采用一种均匀的策略&#xff0c;即对所有训练数据中的下一个词进行预测&#xff0c;这种方法被称为因果语言建模&#xff08;Causal Language Modeling, CLM&#xff09;。虽然C…