leetcode动态规划之零钱兑换问题

Python求解零钱兑换问题 输出东西只有这么点但是我思考了很久(哭)问题的分析思路可以参考思路的链接,但是up主的使用Matlab的写法让我在Python里写的很费劲(菜)关于and 前后的两个条件顺序不可以调换。如果调换,money-c可能是负数,超出了res的坐标范围,这时Python 并不会继续执行money-c>=0的条件,而是直接返回出out of range的错误。第一次做输出,如有不足欢迎佬们指正~ 阅读详情

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

输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
输入: amount = 3, coins = [2]
输出: 0
解释: 只用面额2的硬币不能凑成总金额3。
输入: amount = 10, coins = [10] 
输出: 1

解题

Images

代码:

class Solution {
public:
    int change(int amount, vector<int>& coins) {

        int row=coins.size()+1;
        int col=amount+1;
     
        if(amount==0)
        return 1;
           if(row==1)
        return 0;
        vector<vector<int>> dp(row,vector<int>(col,0));
        for(int i=0;i<row;i++)
        dp[i][0]=1;

        for(auto a:dp[0])
        cout<<a;
        cout<<endl;
        for(int i=1;i<row;i++)
        {
            for(int j=1;j<col;j++)
            {
                if(j-coins[i-1]<0)
                dp[i][j]=dp[i-1][j];
                else
                dp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]];

            }
        }
        for(auto b:dp[1])
        cout<<b;

        return dp[row-1][col-1];

    }
};

那么接下来如何进行状态压缩呢

我们发现只是和dp[i][…]以及dp[i-1][…]有关.所以压缩;

举个例子,我们将table[0][j]状态存在二维表的第0行,接着推出table[1][j]对应的值,并将table[1][j]的状态存放于二维表的第1行。再接着推出table[2][j]的状态时,table[0][j]的状态已经没有保存意义了,因此直接将table[2][j]的状态保存到二维表的第0行,并以此类推,使数组空间得到循环利用。

Images

有时候压缩也要注意遍历的方向,不可以影响后面的结果
比如
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].

class Solution {
public:
    int change(int amount, vector<int>& coins) {

        int row=coins.size()+1;
        int col=amount+1;
     
        if(amount==0)
        return 1;
           if(row==1)
        return 0;
        vector<int> dp(amount+1,0);
        dp[0]=1;

        for(int i=1;i<row;i++)
        {
            for(int j=1;j<col;j++)
            {
                if(j-coins[i-1]>=0)
                dp[j]=dp[j]+dp[j-coins[i-1]] ;        
            }
        }
       

        return dp[amount];

    }
};
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        //动态规划
        int sum=0;
        for(auto a:nums)
        sum+=a;
        if(sum%2!=0) return false;
        sum=sum/2;
        // int row=nums.size()+1;
        // int col=sum+1;
        // vector<vector<bool>> dp(row,vector<bool>(col,false));
        // for(int i=0;i<row;i++)
        // dp[i][0]=true;
        // cout<<dp[1][0];
        // for(int i=1;i<row;i++)
        // {
        //     for(int j=1;j<col;j++)
        //     {
        //        if(j-nums[i-1]<0) 
        //        dp[i][j]=dp[i-1][j];
        //        else
        //         dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]];
        //     }
        // }
        // return dp[row-1][col-1];
        vector<bool> dp(sum+1,false);
        dp[0]=true;
        for(int i=1;i<=nums.size();i++)
        {
            for(int j=dp.size();j>0;j--)// **为了不影响结果,所以选择遍历方向时候要适当改变**
            {
                if(j-nums[i-1]>=0)
                dp[j]=dp[j-nums[i-1]]||dp[j];
            }
        }
        return dp[sum];

    }
};
【算法-动态规划】零钱兑换问题-力扣 322 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

相关推荐

AAC编解码器在实时通信中的性能对比与应用选择

本文深入分析了AAC编解码器在实时通信中的性能优化,重点对比了faac、faad2与fdk-aac三大开源方案在WebRTC场景下的表现。通过实测数据揭示其在延迟、音质和资源消耗等关键指标的差异,并提供场景化选型建议与调优技巧,帮助开发者提升实时音视频通信质量。

weixin_29210727的博客 389

动态规划入门2: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 来源:力扣(LeetCode) 链接:https://l...

qq_35299223的博客 449

C#实战:如何从零构建一个轻量级软PLC梯形图编辑器(附完整源码)

本文详细介绍了如何使用C#从零开始构建一个轻量级软PLC梯形图编辑器。内容涵盖项目架构设计、GDI+图形渲染、编辑交互实现以及核心的扫描执行引擎开发,并提供了定时器、计数器等高级功能的实现思路与完整源码,为开发者深入工业自动化领域提供了实战指南。

4k5l6j7h8的博客 257

中级算法之动态规划:零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你...

qq_41220834的博客 280

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 380

单细胞测序中pseudo bulk差异分析的实战指南与审稿人应对策略

本文提供了单细胞测序中pseudo bulk差异分析的完整实战指南,旨在应对审稿人对样本量统计效力的质疑。文章详细解析了从数据聚合、使用DESeq2进行差异分析,到与单细胞水平结果进行交叉验证的全流程,并给出了应对常见问题与撰写回复的策略,帮助研究者提升结论的稳健性与说服力。

weixin_29214199的博客 820

LeetCode零钱兑换(动态规划)

LeetCode零钱兑换(动态规划)

山雀的博客 1504

江科大51单片机笔记【1】单片机及开发板介绍

单片机,Micro Controller Unit,简称MCU,内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(传感器)、处理(CPU)和硬件设备(电机、LED)的控制单片机算是一个袖珍版计算机,是一个完整的计算机系统,成本低体积小结构简单单片机的使用领域:智能仪表、实时工控、通讯设备、导航系统、家用电器等。

2301_80195807的博客 834

零钱兑换

钞票面值coins = [1, 2 , 5, 7, 10],金额:14dp[i],代表金额i的最优解(最少使用张数),数组dp[]中存储金额1到14的最优解计算dp[i]时,dp[0],...dp[i-1]都是已知的,而金额i 可由:金额i-1和 1 组合,i-2和2组合,i-5和5组合,i-7和7组合,i-10和10组合。即状态i可由状态i-1,i-2, i- 5,i-7,i-10,5个状态所转...

qq_22080999的博客 1552

用 SAP-ABAP-1 把 ABAP 代码理解这件事交给 AI:从遗留代码到 ABAP Cloud 的开发加速器

SAP-ABAP-1是SAP推出的首个专用ABAP基础模型,专注于理解和解释ABAP代码,帮助开发者更快迁移和维护遗留系统。它强调ABAP Cloud合规编码实践,通过SAP AI Foundation提供访问,主要能力包括代码解释、业务语义理解和框架约束分析。相比通用模型,它能更好处理ABAP特有的版本差异、权限控制和扩展边界等问题。该模型可集成到多种开发环境中,支持文件化开发体验,并能与SAP Joule等工具协同工作,为ABAP团队提供智能辅助。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3824

Open3D——直通滤波(python详细过程版)【2025最新版】

python就一个字:强。博客长期更新,本文最近更新时间为:2025年1月11日。

点云侠的博客 7516

【LeetCode】零钱兑换及其升级版(动态规划、回溯法)

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

凝眸伏笔的博客 4244

C2f-DCN模块详解:可变形卷积与特征融合的完美结合

C2f模块作为YOLOv8的核心创新,代表了目标检测特征提取模块设计的最新进展。通过精简的卷积配置(仅2个基础卷积)、高效的特征重用设计(部分通道分割复用)、以及深层语义与浅层细节的协同建模能力,C2f在结构设计和性能表现上全面超越了前代的C3模块。与C3K2、C3K等变体相比,C2f在遮挡和密集环境下的检测鲁棒性更优,而C3K2和C3K分别在高速检测和多尺度检测方面有专门优化。这种差异化设计反映了YOLO系列模型向场景化、专业化发展的趋势。从设计原理角度看,C2f的核心优势在于其多路径梯度流动优化和。

浩瀚之水的专栏 378

【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣

01背包问题动态规划解法 本文介绍了01背包问题的动态规划解决方案。背包容量为w,有n件物品,每件物品有重量和价值,且只能使用一次。通过构建二维dp数组,其中dp[i][j]表示前i件物品放入容量j背包的最大价值。递推公式为:dp[i][j] = max(不放入当前物品的价值,放入当前物品的价值)。初始化时,背包容量为0时价值均为0。遍历顺序可先物品后容量或反之,最终得到最大价值总和。该方法将暴力解法的指数复杂度优化为多项式时间复杂度。

先做到 再看见 4143

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

动态规划解leetcode.322零钱兑换问题

其中 cj​ 代表的是第 j 枚硬币的面值。如手中有面值为1、2、5的硬币,需要七元,可以在F(7-5)=F(2)种可能的基础上增加一枚5元硬币(注:F(2)指需要2元时不同的硬币组合数量),因为新加入一枚硬币,所以F(2)+1;定义 F(i) 为组成金额 i 所需最少的硬币数量,假设在计算 F(i) 之前,我们已经计算出 F(0)−F(i−1) 的答案。(即未被更新过),说明无法凑出目标金额,返回。:将问题分解为子问题(凑出更小的金额)。你可以认为每种硬币的数量是无限的。,即最少需要的硬币数。

2301_81193552的博客 1210

NTscan扫描工具

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

力扣 322.零钱兑换(动态规划问题)

力扣 322.零钱兑换(动态规划问题) 题目: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 动态规划问题解题一般分为 1、明确问题 2、转移方程 3、初始条件和边界情况 4、计算顺序 我们按照这个步骤来对这道算法题进行解答 一、明确问题(简

qq_48736958的博客 504

力扣322. 零钱兑换(动态规划:最值型问题)

力扣322. 零钱兑换(动态规划) https://leetcode-cn.com/problems/coin-change/ 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2],...

小麦China的博客 526

动态规划——完全背包问题(力扣322: 零钱兑换)

前言 这次我们要说的是完全背包问题, 还记得下面这张图吗,可以看到01背包问题和完全背包问题的区别在于每种物品的数量 01背包问题中每种物品只有一个, 只有选与不选两种情况 完全背包问题种每种物品有多个, 选不选, 选多少都是考虑的问题 定义: 一个背包容积为C, 一共N种物品, 分别编号0, 1, 2....i, i+1, .....N-1, 第i个物品的重量为weight[i], 价值为value[i], 每种物品可以选用任意多次, 问背包中最多可以放入多少价值的物品 分析 完全背包问题.

qq_40472852的博客 785

力扣(LeetCode)322. 零钱兑换(动态规划)(类似完全背包问题)

本题是来自力扣(LeetCode)一道中等难度的问题。用动态规划求解非常巧妙,同样背包问题也是笔试中的高频问题,本人现在还在研究之中,先把这道题搞懂分享给大家,希望大家共同进步。 题目链接:https://leetcode-cn.com/problems/coin-change/ 题目: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 示例1: 输入: coins = [1, ..

bestination的博客 540

Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析

问题本质:完全背包问题,求最少物品数量算法核心动态规划(自底向上) vs记忆化搜索(自顶向下)最优解法动态规划,时间O(amount × n),空间O(amount)关键洞察:贪心策略在此类问题中不总是有效实际价值:体现了动态规划在资源优化问题中的重要作用。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1088

LeetCode动态规划完全背包问题——518.零钱兑换II

518. 零钱兑换 II给你一个整数数组 表示不同面额的硬币,另给一个整数 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 。假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 牢记动态规划五步:1.确定dp数组含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.举列推导 动态规划做题方法: 做动规题目的时候,很多同学会陷入一个误区,就是以为把状态转移公式背下来,照葫芦画瓢改改,就开始写代码,甚至把题目AC之后,都不太清

w20001118的博客 391

力扣322.零钱兑换(动态规划完全背包问题模板题)

要装5块钱的袋子,1能装进去,所以最小值就是装4块的袋子的最小硬币数量加上这个1块的硬币,因为每个能装的硬币都试过了,所以dp[5]最后的值就是需要的最少硬币数量。但是我们并不需要知道前1到前n-1个零钱组成0到amount块钱需要的最小数量。遍历所有能装进去的硬币,即面值小于需要达到的钱包的硬币,然后把他装进去就行了。我们只关心前硬币能否装进去和钱为0到amount的时候的最小硬币数。比如我要有个5块钱的袋子,我有1,2,3块钱面值的硬币。那么dp[5]的时候就遍历1,2,3面值的硬币。

m0_71297096的博客 312

力扣动态规划-零钱兑换

咋说呢,本来想用背包思想做的,但是发现直接套通用公式不行,然后自己画图推出来递归公式就做出来了。说实话,学算法真的蛮累的,好多时候一个题花的时间都要用h来计算,不过有进步了真的很开心,希望大家都能在刷题的路上坚持下去。题目来自力扣,我一般不会发布力扣相关的题解,因为上面的题解真的还是很详细了,但这是最近第一道自己做出来的动态规划题,敲开心。还是老规矩,代码中有很详细的解析,希望能帮到大家。

heyiting666的博客 603

【算法-LeetCode】322. 零钱兑换(动态规划;博采众长的完全背包问题详解;二维数组;滚动数组)

322. 零钱兑换 - 力扣(LeetCode) 发布:2021年8月15日20:09:47 问题描述及示例 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change 著作权归领扣网络所有。商业转载请联系

赖念安的博客 3407

LeetCode 0322.零钱兑换:动态规划(DP)

LeetCode 0322.零钱兑换:动态规划(DP) 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。

<font color="Pink">Tisfy的博客</font> 966

力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

力扣题目:#518.零钱兑换II(完全背包组合问题)刷题时长:7min解题方法:动态规划(完全背包)复杂度分析问题总结本题收获力扣题目:#377.组合总和Ⅳ(完全背包排列问题)刷题时长:7min解题方法:动态规划(完全背包)复杂度分析问题总结本题收获

m0_73817408的博客 1120
上一篇: ubuntu下显卡(独显,集显)切换
下一篇: leetcode之递归详解
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值