DAY43 ||322.零钱兑换 |279.完全平方数 |139.单词拆分

322.零钱兑换

题目:322. 零钱兑换 - 力扣(LeetCode)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

示例 1:

  • 输入:coins = [1, 2, 5], amount = 11
  • 输出:3
  • 解释:11 = 5 + 5 + 1

示例 2:

  • 输入:coins = [2], amount = 3
  • 输出:-1

思路

dp[j]表示凑够金额所需的最小硬币个数

dp[0]=0表示凑0元所需硬币数是0.其他则初始化为最大值,因为接下来是要找最小值

递推公式则分选择当前硬币和不选择硬币两种情况。

dp[j]=min(dp[j],dp[j-coins[i]).

遍历顺序先物品在背包或背包物品都不影响,和排列组合无关。内层循环为保证完全背包里的物品可以无限次使用,则要递增遍历。

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int>dp(amount+1,INT_MAX);
        dp[0]=0;//凑成金额 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 - coins[i]] == INT_MAX,表示无法用给定硬币凑出金额 j - coins[i],即目前无法到达该状态,所以不应更新 dp[j]。只有当 dp[j - coins[i]] != INT_MAX 时,才有可能通过再加上一个面值为 coins[i] 的硬币凑成金额 j。
                dp[j]=min(dp[j],dp[j-coins[i]]+1);
            }
            
        }
        if(dp[amount]==INT_MAX)return -1;//如果没找到能凑成的
        return dp[amount];
        
    }
};

 举例dp(部分)

使用硬币 1

i = 0(硬币面值为 1)时,内层循环更新 dp 数组:

  • 对于 j = 1: dp[1] = min(dp[1], dp[1-1] + 1) = min(INT_MAX, 0 + 1) = 1
  • 对于 j = 2: dp[2] = min(dp[2], dp[2-1] + 1) = min(INT_MAX, 1 + 1) = 2
  • 对于 j = 3: dp[3] = min(dp[3], dp[3-1] + 1) = min(INT_MAX, 2 + 1) = 3
  • 对于 j = 4: dp[4] = min(dp[4], dp[4-1] + 1) = min(INT_MAX, 3 + 1) = 4
  • 对于 j = 5: dp[5] = min(dp[5], dp[5-1] + 1) = min(INT_MAX, 4 + 1) = 5
  • 对于 j = 6: dp[6] = min(dp[6], dp[6-1] + 1) = min(INT_MAX, 5 + 1) = 6
  • 对于 j = 7: dp[7] = min(dp[7], dp[7-1] + 1) = min(INT_MAX, 6 + 1) = 7
  • 对于 j = 8: dp[8] = min(dp[8], dp[8-1] + 1) = min(INT_MAX, 7 + 1) = 8
  • 对于 j = 9: dp[9] = min(dp[9], dp[9-1] + 1) = min(INT_MAX, 8 + 1) = 9
  • 对于 j = 10: dp[10] = min(dp[10], dp[10-1] + 1) = min(INT_MAX, 9 + 1) = 10
  • 对于 j = 11: dp[11] = min(dp[11], dp[11-1] + 1) = min(INT_MAX, 10 + 1) = 11

更新后的 dp 数组是:

dp = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

279.完全平方数

题目:279. 完全平方数 - 力扣(LeetCode)

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

 思路,和上题差不多。dp表示达到背包容量j所需要的完全平方数个数。物品就是i*i。dp【0】初始化为0.dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。

此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);遍历顺序是背包物品或者物品背包都可以。

举例

版本一

背包物品

class Solution {
public:
    int numSquares(int n) {
        vector<int>dp(n+1,INT_MAX);
        dp[0]=0;

        for(int i=0;i<=n;i++)//背包
        {
            for(int j=1;j*j<=i;j++)//物品
            {
                dp[i]=min(dp[i-j*j]+1,dp[i]);//dp是由前面的数推导过来的
            }
        }
        
     return dp[n];
    }
};

版本二

物品背包

class Solution {
public:
    int numSquares(int n) {
        vector<int>dp(n+1,INT_MAX);
        dp[0]=0;

        for(int i=1;i*i<=n;i++)//物品
        {
            for(int j=i*i;j<=n;j++)//背包
            {
                dp[j]=min(dp[j-i*i]+1,dp[j]);//dp[j]表示为了达到容量为j的背包,所需要的完全平方数的最小个数
            }
        }
        
     return dp[n];
    }
};

是的,很简单上面这两题。模板都差不多。

139.单词拆分

思路

单词是物品,字符串是背包,字符串能不能有一个或多个给出的单词组成就是问物品能不能装满背包,而且物品可以重复使用,这就一个完全背包问题。

dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词

初始值,dp[0]=true,因为长度0的字符串是可以被0个单词组成的,且如果是false,往下推导就全是false了。其他值则初始化为false。

递推公式:

如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。

所以递推公式是 if([j, i] 这个区间的子串出现在字典(物品)里 && dp[j]是true) 那么 dp[i] = true。(进一步解释,这里感觉意思是,字符串前段的单词出现在字典里,后段直到当前背包容量末尾的单词也都在字典里,那么这个字符串一定都出现在字典里,就是背包能被物品装满。)

遍历顺序:如果求排列数就是外层for遍历背包,内层for循环遍历物品

而本题字符串里单词的出现是由顺序的,所以我们求得是排列数。

举例dp

代码 

本题还有个旧知识新用,就是把词典数组做个set哈希表,方便查找某单词是否出现在其中。

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<int>dp(s.size()+1,0);
        dp[0]=1;
        unordered_set<string>wordset(wordDict.begin(),wordDict.end());//使用 unordered_set 来存储字典中的单词,方便快速查找。
        for(int i=1;i<=s.size();i++)//背包
        {
            for(int j=0;j<i;j++)//物品,内层循环 j 从 0 到 i-1,用于检查从位置 j 到 i-1 的子字符串。
            {
                string word=s.substr(j,i-j);//!!一个个把(j,i-j)的字符串加入到word中,直到确认存在词典中
                if(wordset.find(word)!=wordset.end()&&dp[j]==true)//如果该子字符串存在于字典中(通过 wordset.find(word) != wordset.end()),并且 dp[j] 为 true(表示前 j 个字符可以被拆分),则我们可以将 dp[i] 设置为 true。
                dp[i]=true;
            }

        }
        return dp[s.size()];
        
    }
};

打印dp数组

假设我们有以下输入:

  • 字符串: s = "leetcode"
  • 字典: wordDict = ["leet", "code"]
初始化 dp 数组

初始的 dp 数组为:

dp = [1, 0, 0, 0, 0, 0, 0, 0, 0] // dp[0] = 1
填充 dp 数组

逐步遍历并更新 dp 数组的过程如下:

  1. i = 1:

    • j = 0: word = "l",不在字典中,继续。
    • dp[1] = 0
  2. i = 2:

    • j = 0: word = "le",不在字典中。
    • j = 1: word = "e",不在字典中。
    • dp[2] = 0
  3. i = 3:

    • j = 0: word = "lee",不在字典中。
    • j = 1: word = "e",不在字典中。
    • j = 2: word = "e",不在字典中。
    • dp[3] = 0
  4. i = 4:

    • j = 0: word = "leet",在字典中,且 dp[0] = 1
    • 更新 dp[4] = 1
  5. i = 5:

    • j = 0: word = "leetc",不在字典中。
    • j = 1: word = "eec",不在字典中。
    • j = 2: word = "ec",不在字典中。
    • j = 3: word = "c",不在字典中。
    • dp[5] = 0
  6. i = 6:

    • j = 0: word = "leetco",不在字典中。
    • j = 1: word = "etco",不在字典中。
    • j = 2: word = "et",不在字典中。
    • j = 3: word = "c",不在字典中。
    • j = 4: word = "co",不在字典中。
    • dp[6] = 0
  7. i = 7:

    • j = 0: word = "leetcod",不在字典中。
    • j = 1: word = "etcod",不在字典中。
    • j = 2: word = "etc",不在字典中。
    • j = 3: word = "c",不在字典中。
    • j = 4: word = "co",不在字典中。
    • j = 5: word = "o",不在字典中。
    • dp[7] = 0
  8. i = 8:

    • j = 0: word = "leetcode",不在字典中。
    • j = 1: word = "eetcode",不在字典中。
    • j = 2: word = "etc",不在字典中。
    • j = 3: word = "c",不在字典中。
    • j = 4: word = "co",不在字典中。
    • j = 5: word = "o",不在字典中。
    • j = 6: word = "e",不在字典中。
    • dp[8] = 0

最终 dp 数组为:

dp = [1, 0, 0, 0, 1, 0, 0, 0, 1]

小小总结,完全背包的排序问题所求涉及三方面:组合数,排列数,最小数。

背包总结篇如图

多重背包理论基础

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

多重背包和01背包是非常像的, 为什么和01背包像呢?

每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

例如:

背包最大重量为10。

物品为:

重量价值数量
物品01152
物品13203
物品24302

问背包能背的物品最大价值是多少?

和如下情况有区别么?

重量价值数量
物品01151
物品01151
物品13201
物品13201
物品13201
物品24301
物品24301

毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebGL进阶(五)-可视域

理论基础&#xff1a; 顶点着色器 Vertex Shader 主要是负责处理顶点位置、顶点颜色、顶点向量等顶点的数据&#xff1b;处理一些顶点的变换&#xff1a;例如在进行视图变换和投影变换时MVP矩阵会改变顶点的位置信息。 输入&#xff1a; 顶点着色器输入部分主要是声明&…

gin入门教程(10):实现jwt认证

使用 github.com/golang-jwt/jwt 实现 JWT&#xff08;JSON Web Token&#xff09;可以有效地进行用户身份验证,这个功能往往在接口前后端分离的应用中经常用到。以下是一个基本的示例&#xff0c;演示如何在 Gin 框架中实现 JWT 认证。 目录结构 /hello-gin │ ├── cmd/ …

三星瞄准2026年推出400层垂直NAND技术,2030年前剑指1000层NAND闪存

据报道&#xff0c;三星计划在2026年前推出400层的垂直NAND闪存&#xff0c;并且目标是在2030年前实现1000层的NAND技术。随着人工智能&#xff08;AI&#xff09;浪潮的到来&#xff0c;高带宽内存&#xff08;HBM&#xff09;已经成为存储巨头之间的关键战场&#xff0c;而同…

端口号和ip地址一样吗?区别是什么

在网络通信的世界里&#xff0c;端口号和IP地址是两个不可或缺的概念&#xff0c;它们各自扮演着独特的角色&#xff0c;共同维系着数据在网络中的有序传输。然而&#xff0c;对于许多初学者而言&#xff0c;这两者往往容易被混淆&#xff0c;认为它们是同一事物的不同表述。那…

前端自学资料(笔记八股)分享—CSS(4)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

JavaScript字符串不可变性与ES6 新增字符串方法详解

非 VIP 用户可前往公众号“前端基地”进行免费阅读,文章链接如下: JavaScript字符串不可变性与ES6 新增字符串方法详解本文介绍了 JavaScript 中字符串的不可变性以及 ES6 新增的字符串方法。包括判断是否包含、以指定字符串开头或结尾,还有重复指定次数等方法,并结合案例…

鸿蒙开发:arkTS FolderStack容器组件

ArkTS(也称为Ark TypeScript)是鸿蒙生态的应用开发语言&#xff0c;它在TypeScript(简称TS)的基础上进行了优化和定制&#xff0c;以满足鸿蒙系统的开发需求。今天给大家分享arkTS FolderStack容器组件技术知识&#xff0c;如果有所帮助&#xff0c;大家点点关注支持一下&#…

SSL/TLS 密码套件漏洞分析以及修复方法

1. 前言 在当今数字化时代&#xff0c;网络安全至关重要。SSL/TLS 协议作为保障网络通信安全的重要手段&#xff0c;广泛应用于各类网络应用中。然而&#xff0c;如同任何技术一样&#xff0c;SSL/TLS 也并非绝对安全&#xff0c;存在着一些可能被攻击者利用的漏洞。本文将深入…

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展&#xff0c;电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法&#xff0c;帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹&#xff0c;还可以加密保…

已解决Navicat 选择Mysql表 报错unkonow internal error: Access violation - no RTTI data

已解决Navicat 选择Mysql表 报错unkonow internal error&#xff1a; Access violation - no RTTI data 报错信息截图&#xff1a; 使用Navicat Premium15 选择sql server表时 出现大量弹窗报错&#xff0c;导致sql文件执行不了&#xff0c;右键数据库执行外部文件也失败了。弹…

【机器学习】揭秘XGboost:高效梯度提升算法的实践与应用

目录 &#x1f354; XGBoost 原理 1.1 目标函数确定和树的复杂度介绍 1.2 XGBoost目标函数的推导 1.3 泰勒公式展开 1.4 化简目标函数 1.5 问题再次转换 1.6 对叶子结点求导 1.7 XGBoost的回归树构建方法 &#x1f354; XGBoost API 2.1 通用参数 2.2 Booster 参数 …

基于vue框架的的高校学习资源共享系统5ym3y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,学校信息,课程分类,班课信息,班课申请,学习资源,班课评价,班课投诉,投诉学生,教师,班级 开题报告内容 基于Vue框架的高校学习资源共享系统开题报告 一、项目背景与意义 随着信息技术的飞速发展和教育改革的深入推进&#xff0c;…

Hadoop生态圈框架部署(二)- 配置IP地址映射为主机名及免密登录

文章目录 前言一、配置IP地址映射为主机名1. 虚拟机hadoop1配置主机名与 IP 地址的映射关系2. 虚拟机hadoop2配置主机名与 IP 地址的映射关系3. 虚拟机hadoop3配置主机名与 IP 地址的映射关系 二、配置免密登录1. 配置虚拟机hadoop1免密登录到hadoop1、hadoop2和hadoop32. 配置…

基于JSP的篮球系列网上商城系统【附源码】

基于JSP的篮球系列网上商城系统 效果如下&#xff1a; 系统首页界面 商品信息界面 购物车界面 购物车界面 管理员登录界面 管理员功能界面 用户注册界面 我的收藏界面 研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限…

力扣题86~90

题86&#xff08;中等&#xff09;&#xff1a; python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…

Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)

一、异常 在Python中&#xff0c;异常&#xff08;Exception&#xff09;是一种用于处理在程序运行时可能发生的错误情况的机制 异常允许程序在检测到错误时不是简单地崩溃&#xff0c;而是能够优雅地处理这些错误&#xff0c;可能包括记录错误信息、清理资源、或者向用户提…

5G NR:BWP入门

简介 5G NR 系统带宽比4G LTE 大了很多&#xff0c;4G LTE 最大支持带宽为20MHz&#xff0c; 而5G NR 的FR1 最大支持带宽为100MHz&#xff0c; FR2 最大支持带宽为 400MHz。 带宽越大&#xff0c;意味了终端功耗越多。为了减少终端的功耗&#xff0c;5G NR 引入了BWP(Band Wid…

哪款宠物空气净化器能吸毛还低噪?希喂、范罗士真实测评

作为一个养宠清洁博主&#xff0c;这些年为了让家里更干净&#xff0c;让猫在家里更舒服&#xff0c;我也测了不少的清洁家电&#xff0c;其中包括洗地机、吸尘器、空气净化器以及扫地机器人等&#xff0c;其中宠物空气净化器的表现也算十分优异。 它可以快速去除空气中的浮毛…

【ComfyUI】手动安装部署ComfyUI的运行环境

如果不喜欢已有的一键启动包&#xff0c;我们可以手动的安装和部署ComfyUI的运行环境&#xff0c;相比一键安装包&#xff0c;自己部署ComfyUI 环境具有相当大的灵活性&#xff0c;其实部署ComfyUI 环境非常简单&#xff0c;不像网上说的那么复杂。下面我们就按照顺序给大家分享…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …