代码随想录的复习刷题计划1 :动态规划背包问题 01背包+完全背包

news2024/11/30 14:45:00

动态规划刷题复习

在这里插入图片描述

一、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;
        else
            return 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 >= target

        vector<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);
        //这个初始条件很重要,当初始化为全零的时候结果为0
        dp[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和1
            int 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]初始化为1
        dp[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]初始化为1
        dp[0]=1;
        //最少上一层台阶
        for(int i=1;i<=n;i++) {
            //这里物品遍历选择只有1,2
            for(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_MAX
        vector<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);
            }
        }
        //如果凑不到这个总金额的话,这个值没有修改,就返回-1
        if(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.coloradmin.cn/o/1824597.html

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

相关文章

腾讯大模型最新路线图,主打一个“实用”

让大模型更接地气&#xff0c;腾讯交出一份阶段性答卷。 大模型狂奔一年多后&#xff0c;正迈向产业落地的深水区。如何用好这一革命性的新技术&#xff0c;已成为整个社会的一道必答题。 去年&#xff0c;国内大模型百花齐放&#xff0c;外界关注的焦点也集中在模型能力上。…

Win11 问题集

文章目录 一、Win11 选择其他应用打开无反应1、新建 1.reg 文件2、新建 2.reg 文件3、运行 reg 文件 二、Win11 账户怎么改名 一、Win11 选择其他应用打开无反应 Win11选择打开方式卡死怎么办? 选择打开方式没有反应的解决办法 1、新建 1.reg 文件 1.reg Windows Registry…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

计算机木马

病毒具有传播特性、恶意性 木马没有巨大的恶意&#xff0c;主要是帮黑客做些事情&#xff0c;没害你&#xff0c;没有那么广大的传播性

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码

LIMS&#xff08;实验室&#xff09;信息管理系统源码、有哪些应用领域&#xff1f;采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统&#xff0c;是一种基于计算机硬件和数据库技术&#xff0c;集多个功能模块为一体的信息管理系统。该系统主…

有监督学习——梯度下降

1. 梯度下降 梯度下降&#xff08;Gradient Descent&#xff09;是计算机计算能力有限的条件下启用的逐步逼近、迭代求解方法&#xff0c;在理论上不保证下降求得最优解。 e.g. 假设有三维曲面表达函数空间&#xff0c;长(x)、宽(y)轴为子变量&#xff0c;高(z)是因变量&…

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…

博科SAN交换机初始化和Zone创建

1 初始化 博科的SAN交换机默认配置&#xff1a; 地址&#xff1a;10.77.77.77 账户&#xff1a;admin 密码&#xff1a;password 设备硬件查看 ***-SAN-1:admin> chassisshowFAN Unit: 1 Fan Direction: Reverse (Non-portside Intake) Time Awake: 0 daysP…

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

电脑屏幕录制怎么录制?这7个录制屏幕的技巧值得一试!

电脑屏幕录制怎么录制&#xff1f;屏幕录制是什么? 简单地说&#xff0c;电脑屏幕录制就是在你的设备屏幕上录制视频。它可以捕捉屏幕上正在发生的事情&#xff0c;并让你与其他人分享。记录电脑、手机或笔记本电脑屏幕的原因有很多&#xff1a; 1. 一个简单的屏幕录制可以用…

C++程序员笔试训练

面试题1&#xff1a;使用库函数将数字转换位字符串 考点&#xff1a;c语言库函数中数字转换位字符串的使用 char *gcvt(double number, int ndigit, char *buf);参数说明&#xff1a; number&#xff1a;待转换的double类型数值。 ndigit&#xff1a;保留的小数位数。 buf&am…

环保绩效创A带来的多重效益?

在当今时代&#xff0c;环境保护已成为全球共识&#xff0c;而重点行业的环保绩效创A更是推动绿色转型、朗观视觉实现可持续发展的关键所在。随着工业化进程的加快&#xff0c;环保问题日益凸显&#xff0c;如何通过环保绩效创A&#xff0c;推动重点行业走上绿色、低碳、循环的…

【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南

目录 &#x1f497;1. 准备工作和环境配置&#x1f495; &#x1f496;安装OpenCV&#x1f495; &#x1f496;安装Dlib&#x1f495; 下载并编译TensorFlow C API&#x1f495; &#x1f497;2. 下载和配置预训练模型&#x1f495; &#x1f496;2.1 下载预训练的ResNet…

文章MSM_metagenomics(三):Alpha多样性分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程使用基于R的函数来估计微生物群落的香农指数和丰富度&#xff0c;使用MetaPhlAn prof…

热镀锌钢板耐液体性能测 彩钢板抗拉强度检测

钢板检测范围&#xff1a;钢板、彩钢板、不锈钢板、耐磨钢板、合金钢板、压型钢板、冷轧钢板、弹簧钢板、碳钢板、热轧钢板、厚钢板、热镀锌钢板、冲孔钢板、船用钢板、硅钢板、花纹钢板、压力容器钢板、耐候钢板、 钢板检测项目包括化学性能检测、性能检测、机械性能检测、老…

JAVA-CopyOnWrite并发集合

文章目录 JAVA并发集合1_实现原理2_什么是CopyOnWrite?3_CopyOnWriteArrayList的原理4_CopyOnWriteArraySet5_使用场景6_总结 JAVA并发集合 从Java5开始&#xff0c;Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类&#xff0c;它们既能包装良好的访问性能…

SwiGLU激活函数与GLU门控线性单元原理解析

前言 SwiGLU激活函数在PaLM&#xff0c;LLaMA等大模型中有广泛应用&#xff0c;在大部分测评中相较于Transformer FFN中所使用的ReLU函数都有提升。本篇先介绍LLaMA中SwiGLU的实现形式&#xff0c;再追溯到GLU门控线性单元&#xff0c;以及介绍GLU的变种&#xff0c;Swish激活…

phpcms仿蚁乐购淘宝客网站模板

phpcms仿蚁乐购网站模板&#xff0c;淘宝客行业模板免费下载&#xff0c;该模板网站很容易吸引访客点击&#xff0c;提升ip流量和pv是非常有利的。本套模板采用现在非常流行的全屏自适应布局设计&#xff0c;且栏目列表以简洁&#xff0c;非常时尚大气。页面根据分辨率大小而自…

华为北向网管NCE开发教程(7)历史告警采集

1准备工作 准备一个FTP服务器和网管北向网络通&#xff0c;网管北向生成告警文件&#xff0c;会推送到准备的FTP服务器上。 linux&#xff0c;都是自带FTP的&#xff0c;如果是linux则无需自己搭建&#xff0c;如果是windows则需要自己搭建 2生成告警文件 2.1方法说明getAll…

使用libcurl实现简单的HTTP访问

代码; #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> // 包含libcurl库 FILE *fp; // 定义一个文件标识符 size_t write_data(void *ptr,size_t size,size_t nmemb,void *stream) { // 定义回调函数&#xff0c;用于将…