LeetCode 518. 零钱兑换 II(完全背包问题变形)

背包问题的变形 今天tyvj抽了,做不了题目了,明天工数考试,还有几天就能回家了! 发两道最近做的背包的变形题吧,都不是很难的题目。 一 描述 一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如样例的第一行就是一个费用的单子。   没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1 输入格式  第一行十个整数分别表示 阅读详情

描述

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

示例 1:
输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:
输入: amount = 3, coins = [2]
输出: 0
解释: 只用面额2的硬币不能凑成总金额3。

示例 3:
输入: amount = 10, coins = [10]
输出: 1

注意:
你可以假设:
0 <= amount (总金额) <= 5000
1 <= coin (硬币面额) <= 5000
硬币种类不超过 500 种
结果符合 32 位符号整数

思路

动态规划的背包问题共有三种:0-1背包、完全背包、子集背包。这道题是其中的完全背包问题的一种变形,完全背包即“有n种物品,每种物品的可以取无限次,求在背包中能装的最大价值是多少?”不过这里求的是装满背包有多少种方案。还是用完全背包问题的方法,枚举在只考虑前i种物品的情况下,凑出金额j的每一种情况。

按照背包问题的套路,还是需要使用二维数组dp[i][j]。它代表的含义就是在只考虑前i种物品的情况下,装满容量为j的背包有多少种方案。

初始值:当只考虑前0种硬币时,凑不出任何金额j,即dp[0][*] = 0,要凑出金额为0,那么就只有一种方案,即什么都不选,即dp[*][0] = 1。

状态转移方程:背包容量j=总金额j;硬币面值等于物品价值;这里物品不限量。
当背包容量不能装下第i种物品时,则dp[i][j] = dp[i-1][j],即不装入第i种物品,则和只考虑前i-1种物品是一样的。
当背包容量能装下第i种物品时,则dp[i][j] = dp[i-1][j] + dp[i][]j-coins[i-1],因为coins是从0开始索引的,所以是i-1。既然能装下第i种物品,那么这时的凑出背包容量j的方案总数就应该等于使用第i种物品和不使用第j种物品的方案之和。若不使用第i种硬币,那便是使用前i-1种硬币凑出j的方案数dp[i-1][j];若使用第i种硬币,则在减去第i种硬币面值的情况下,剩余的面值的方案数再加上第i种硬币的面值即可凑出总金额j。这里为什么是dp[i][j - coins[i-1]]呢,因为第i种硬币是无限的,前面的总金额为j - coins[i-1]的情况下可能已经使用了第i种硬币。

解答

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        int size = coins.size();
        vector<vector<int> > dp(size + 1, vector<int>(amount + 1, 0));
        for(int i = 0;i <= size; ++ i) dp[i][0] = 1;

        for(int i = 1;i <= size; ++i)
            for(int j=1; j <= amount;++ j){
                if(j >= coins[i-1])//能装下
                    dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]];//不装+装入
                else//装不下
                    dp[i][j] = dp[i-1][j];
            }
    return dp[size][amount];
    }
};
动态规划dp专题-(上) 第i个数的斐波那契数值是dp[i]②。 阅读详情

相关推荐

Obsidian与GPT协作:数学公式从KaTeX到MathJax的无缝转换实践

本文针对Obsidian用户从GPT等AI助手复制数学公式时遇到的KaTeX与MathJax格式不兼容问题,提供了高效的解决方案。重点介绍了KaTeX to MathJax插件的核心作用,它能自动将AI生成的KaTeX格式公式(如\(...\))无缝转换为Obsidian默认支持的MathJax格式($...$),实现复制粘贴后公式即时渲染,极大提升了数学笔记与AI协作的效率和流畅度。

weixin_29209825的博客 136

完全背包的变形POJ1252

话说今天做背包做到有点累了,题目是英文的……而且还很长,我看了好久(弱爆了)。 题目大概的意思就是,有六种硬币,之后,求用这六种硬币最小数目支付1到100美分的平均值,以及最小数目中的最大值。 很容易就想到了不找零的情况。即:1 2 5 45 50 60 六种硬币中,我买了49分,那么应该就是45 +2+2 3个硬币,但是有找零情况下就是50 -1。 这就头痛了,我在想,要不加入硬...

weixin_30387339的博客 146

西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序)

西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485)前言一、FreePort自由口通讯是什么?二、使用步骤1.模块参数定义2.定义FB功能块参数:3.程序代码如下(每天写代码100行,学不会你来找我):总结 前言 很长时间都没有更新了,主要是最近在学习罗克韦尔的STUDIO5000PLC编程软件,怎么说,和博

weixin_42940283的博客 1万+

完全背包问题(动态规划(DP))

原题 完全背包问题 有n种重量和价值分别为wi,vi的物品。从这些物品中挑选总重量不超过W的物品,求出挑选物品价值总和的最大值。在这里,每种物品可以挑选任意多件。 1 1 1 样例输入 n=3 (w,v)={(3,4),(4,5),(2,3)} W=7 样例输出 10(0号物品选1个,2号物品选2个) 涉及知识及算法 递推关

快速进入竞赛模式! 7554

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 374

dreamerv3复现教程

由于dreamerv3存在很多版本冲突问题,所以很难直接使用和复现。

无人机飞啊飞啊飞 2833

背包问题及其变型(python)

1. 0,1问题 一个背包,往里装东西,重量w(weight)分别为为[2,3,4,5] 价值v(value)对应为[3,4,5,6] 如果你的容量为8,每个物品只有一个,求你能装入背包的最大价值 我们可以一步一步来 ,先创建一个表格(数组), 数组dp[i][j] i代表你只用前i个物体,j代表你的剩余容量,得到一个表格 先填第一行(也就是假设现在你只有第一个物体), 首......

我的博客 2万+

基于MUSIC算法的DOA估计Matlab仿真

特别需要指出的是:通道与阵元并不是一一对应,通道是由空间的一个、几个或所有阵元合成的,当然空间某个特定的阵元可包含在不同的通道内。空间谱估计侧重于研究空间多传感器阵列所构成的处理系统对感兴趣的空间信号的多种参数进行准确估计的能力,其主要目的是估计信号的空域参数或信源位置,这也是雷达、通信、声纳等许多领域的重要任务之一。从系统框图中可以清晰的看出,估计空间相当于是对目标空间的一个重构过程,这个重构的精度由众多因素决定,如环境的复杂性、空间阵元的互耦、通道不一致、频带不一致等。

FPGA/MATLAB学习教程/源码/项目合作开发 1747

完全背包问题变形_来自师范的计科学渣--李佳_新浪博客

完全背包 时间限制:3000ms | 内存限制:65535KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。本题要求是背包恰好装满背包时,求出最大价值总和是多少。如果不能恰好装满背包,输出NO 输入 第一行:...

来自师范的学渣 449

GEO的工作原理,以及GEO会催生出更多的爬虫岗位吗?

摘要: GEO(生成式引擎优化)是提升内容在AI搜索(如ChatGPT、Perplexity等)中引用率的新策略,核心在于优化内容的可抓取性、语义清晰度、权威性。与传统SEO不同,GEO聚焦AI的引用逻辑,需通过爬虫监控AI回答、逆向分析引用源特征(如结构化数据、权威背书),并构建自动化工具优化内容。爬虫工程师需转型为“AI可见性基础设施构建者”,重点关注高权威站点、知识库及官方信息源,同时确保技术可抓取性(如放行AI爬虫UA)。GEO的核心是从“排名”转向“被AI引用”,强调实体识别与动态对话适配。

数据知道的博客 4640

PyTorch视觉项目实战:从数据加载到模型部署

PyTorch视觉项目实战:从数据加载到模型部署 ,人工智能,计算机视觉,大模型,AI,随着深度学习在计算机视觉领域的飞速发展,PyTorch 凭借其简洁的代码风格、动态计算图特性以及强大的社区支持,成为众多开发者和研究人员的首选框架。从数据加载、模型构建与训练,到最终的模型部署,PyTorch 提供了一套完整且灵活的解决方案。本文将通过实际项目案例,详细阐述基于 PyTorch 的视觉项目全流程,结合丰富的代码示例和概念解析,帮助读者掌握从项目起步到落地的关键技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

Leetcode518. 零钱兑换 II--动态规划种排列数与组合数的个人愚见

Leetcode518. 零钱兑换 II–动态规划种排列数与组合数的个人愚见 题目链接 题目描述 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面额2的硬

qq_47373183的博客 274

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++ 多重背包状态转移方程_背包问题之零钱兑换

读完本文,你可以去力扣拿下如下题目:518.零钱兑换II-----------零钱兑换 2 是另一种典型背包问题的变体,我们前文已经讲了 经典动态规划:0-1 背包问题 和 背包问题变体:相等子集分割。希望你已经看过前两篇文章,看过了动态规划和背包问题的套路,这篇继续按照背包问题的套路,列举一个背包问题的变形。本文聊的是 LeetCode 第 518 题 Coin Change 2,题目如下:in...

weixin_39741101的博客 124

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

L518零钱兑换 II

零钱兑换 II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0...

weixin_41759020的博客 450

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

代码随想录算法训练营第三十七天|518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)

题目:给你一个整数数组 表示不同面额的硬币,另给一个整数 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 。假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。示例 1: 输入:amount = 5, coins = [1, 2, 5] 输出:4 解释:有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入:amount = 3, coins = [2] 输出:0 解释:只

xiaowutongxue666的博客 1125

leetcode 518.零钱兑换 II

上一个题的零钱兑换是对于完全背包容量恰好装满的变形形式,需要对于f数组进行初始化,然后转移状态;这里呢只是对于方案数输出的变形,所以我们只需要让除f[0]之外的数组初始值为0就可以了。f[0]=1,因为这代表我们容量为0的时候的方案数,就只有全部都不选这一种方案。我们首先可以看到,每一个数都是可以重复使用的,而且,数的选择上有两种,一种就是选,一种就是不选。所以会想到完全背包问题。思路:和第一道是一样的问题,也就是完全背包问题。

m0_73917165的博客 404

《dp补卡——完全背包问题》

N件物品和一个最多能背重量为W的背包。第i件物品的重量为weight[i],得到的价值是value[i]。每件物品都有无限个(可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 01背包和完全背包唯一不同在于遍历顺序上。 01背包的核心代码: for(int i = 0; i < weight.size(); i++) //遍历物品 { for(int j = bagWeight; j >= weight[i]; j--) //遍历背包容量 { dp.

hanhan的博客 510

6.动态规划:背包问题(0-1背包、完全背包及其变形)【灵神基础精讲】

来源0x3f:https://space.bilibili.com/206214三叶姐的对背包问题的总结:【宫水三叶】详解完全背包一维空间优化推导(附背包问题攻略)

qq_42958831的博客 1057

Leetcode 刷题笔记(二十五) ——动态规划篇之背包问题:完全背包

完全背包问题和背包问题各种题型的总结

a1241692733的博客 1208

leetcode-背包问题

1. 三种背包问题 1.1 0-1背包 有N件物品和一个容量为V的背包,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。 1.2 完全背包: 有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。 1.3 多重背包: 有N种物品和一个容量为V的背包,第i种物品最多有Mi件可用,每件物品消耗的容量为Ci,价值为Wi,求解入哪些物品可以使得背包中总价值最大。 三种背包问题都有一个共同的限制,.

weixin_36378508的博客 864

Day2-2021.1.10 背包问题的学习+整理。little。

2021年1月10日 时间都去哪了?囧 今日计划:力扣题目刷到150。javaweb进行下去,或者学习计算机网络。 今日工作: 今日总结: 下面的笔记的图片没有上传成功,自己是先用Typora做的。明天试试解决。 解决办法:Typora笔记上传到优快云解决图片问题—亲测有效! 转到2021.1.9-2021.1.31的learning record 首页 ...

renxanshou的博客 341

算法第三十七天:动态规划part05(第九章)

完全背包问题定义dp[i]凑出目标和为i的组合(排列)数。

m0_71209549的博客 322

从力扣416题到蓝桥杯国赛:动态规划背包问题深度解析与实战优化

动态规划是解决最优化问题的核心算法思想,其核心原理是将复杂问题分解为重叠子问题,并通过存储子问题的解来避免重复计算,从而提升效率。在算法竞赛和工程实践中,动态规划的价值在于能够高效解决诸如资源分配、路径规划和组合优化等一系列复杂问题。其中,0-1背包问题是一个经典的应用场景,它要求从一组物品中选择若干放入固定容量的背包,以达成某种目标(如价值最大或恰好装满)。本文以力扣经典题目“分割等和子集”为切入点,深入剖析如何将子集划分问题转化为0-1背包模型,并详细讲解状态设计、空间优化(滚动数组与一维数组倒序更新)

weixin_33796177的博客 696

Leetcode刷题记录-动态规划Ⅰ

Leetcode刷题记录-动态规划Ⅰ

weixin_46570364的博客 1215

腾讯经典笔试题“小Q的歌单”:组合计数与动态规划全解析

组合计数是算法竞赛与互联网公司笔试中的高频考点,其核心原理是利用排列组合公式和加法原理,将有限资源分配问题转化为数学方程求解。动态规划则是另一种通用解法,通过状态定义与转移方程处理恰好装满的01背包模型,两者在工程实践中均有广泛应用。无论是秋招笔试题还是LeetCode经典题型,掌握组合数与背包思想都能显著提升解题效率。以腾讯2017秋招笔试题“小Q的歌单”为例,从审题、暴力思路到组合数枚举、动态规划解法逐层拆解,并深入分析取模溢出、循环边界等易错细节,帮助读者建立从数学建模到代码实现的完整思维链。

weixin_34166472的博客 345
上一篇: LeetCode 300. 最长上升子序列
下一篇: LeetCode 416. 分割等和子集(0-1背包问题变形)
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值