322-零钱兑换(完全背包)

国腾|GM8775C替换TC358775/MIPI转双通道LVDS 1 产品概述 GM8775C 型DSI 转双通道 LVDS 发送器产品主要实现将MIPI DSI 转单/双通道 LVDS 功能,MIPI 支持 1/2/3/4 通道可选,最大支持 4Gbps 速率。LVDS时钟频率最高154MHz,最大支持视频格式为 FULL HD(1920 x 1200)。 该芯片主要应用于手持设备、双屏显示,大屏幕显示等应用需求。 2 产品特征 a) I/0电源电压:1.8V /3.3V; b) core 电源电压... 阅读详情

题目

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:coins = [1], amount = 0
输出:0

示例 4:

输入:coins = [1], amount = 1
输出:1

示例 5:

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

题解一(dp)

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp=new int[amount+1];//dp[i]表示总量为i时的最少硬币个数
        //状态转移方程:dp[j]=min(dp[j],dp[j-coins[i]]+1)这个是完全背包问题,硬币无限量
        Arrays.fill(dp,amount+1);
        dp[0]=0;//注意边界条件
        for(int coin:coins){
            for(int i=coin;i<=amount;i++){
                if(i>=coin){//余额等于硬币值时,该硬币也可取
                    dp[i]=Math.min(dp[i],dp[i-coin]+1);
                }
            }
        }
        return dp[amount]==amount+1?-1:dp[amount];
    }
}

笔记:

  1. 注意:因为要比较的是最小值,这个不可能的值就得赋值成为一个最大值,即 Arrays.fill(dp, amount + 1),新状态的值要参考的值以前计算出来的「有效」状态值。
    因此,不妨先假设凑不出来,因为求的是小,所以设置一个不可能的数。另外,注意边界条件。
  2. 模板一般是外层coin循环,内层j循环到amount,完全背包是正序,01是倒序。

题解二(BFS)

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount==0){
            return 0;
        }
        Arrays.sort(coins);
        Queue<Integer> queue=new LinkedList<>();
        boolean[] visited=new boolean[amount+1];

        visited[amount]=true;
        queue.offer(amount);
        int count=1;
        while(!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){//在一开始就把size固定下来!因为后面循环的时候队列里还会添加元素!size会变化!这个for循环相当于处理了一行的元素!
                int front=queue.poll();
                for(int coin:coins){//循环三次就跳出来了
                    int next=front-coin;
                    if(next==0){
                        return count;//因为coins排过序了,所以得到的必定是最小的count
                    }
                    if(next<0){
                        break;
                    }
                    if(!visited[next]){
                        visited[next]=true;//避免节点的重复访问
                        queue.offer(next);
                    }
                }
            }
            count++;//走完一层之后,深度加一
        }
        return -1;
    }
}

思路:

  1. 创建一个visited数组记录哪些节点已经被访问过了(节点是指不同数值的amount),访问过尝试失败的不需要再次访问了。因为一开始就要访问amount,所以amount置true。用一个队列记录访问过的节点。将所有的元素从大到小排序,这样得到的第一个step就是最短的step。
  2. 求bfs树的时候每个节点间的差值为coin相关,count代表了树的层数,也就是0到amount的最小步数。

题解三(DFS深度优先+剪枝)

class Solution {
    int ans=Integer.MAX_VALUE;
    public int coinChange(int[] coins, int amount) {
        Arrays.sort(coins);
        dfs(coins,coins.length-1,amount,0);
        return ans==Integer.MAX_VALUE?-1:ans;
    }
    public void dfs(int[] coins,int index,int amount,int cnt){
        if(index<0){
            return;
        }
        for(int c=amount/coins[index];c>=0;c--){
            int na=amount-c*coins[index];
            int ncnt=cnt+c;
            if(na==0){
                ans=Math.min(ans,ncnt);
                break;//剪枝1
            }
            if(ncnt+1>=ans){
                break; //剪枝2
            }
            dfs(coins,index-1,na,ncnt);
        }
    }
}//超时了

class Solution {
    int ans=Integer.MAX_VALUE;
    public int coinChange(int[] coins, int amount) {
        Arrays.sort(coins);
        dfs(coins,amount,coins.length-1,0);
        return ans==Integer.MAX_VALUE?-1:ans;
    }
    public void dfs(int[] coins,int amount,int index,int count){
        if(index<0){//考虑边界条件
            return;
        }
        for(int i=amount/coins[index];i>=0;i--){
            int newAmount=amount-i*coins[index];
            int newCount=count+i;
            if(newAmount==0){//如果amount用完了,看看是否要更新ans
                ans=Math.min(ans,newCount);
                break;
            }
            if(newAmount+1>=ans){
                break;
            }
            dfs(coins,newAmount,index-1,newCount);
        }
    }
}
从QEvent到系统响应:EC如何成为硬件事件的隐形信使 本文深入解析嵌入式控制器(EC)如何作为硬件事件的隐形信使,通过QEvent机制将按键、合盖等物理事件转换为SCI信号,并经由ACPI架构触发操作系统响应。EC与BIOS紧密协作,实现了从底层硬件到系统层面的高效事件传递,是嵌入式开发和系统优化的关键技术。 阅读详情

相关推荐

跟着团子学SAP PS:项目计划成本与项目预算设计思路

​在做SAP PS模块概览培训的时候,很多时候都会用到下面的一页PPT片子讲到项目计划成本与预算的关系,但真正这幅片子想表达的具体内容甚至大部分PS顾问也是无法阐明清楚的。 而SAP PS的设计其实是在丰富的项目管理学的基础上而开展的,所以今天从业务上结合SAP中的功能点讲一下项目成本计划及预算的逻辑。 在项目管理的十大知识领域中,项目成本管理主要是包括为使项目在批准的预算内完成而对成本进行规划...

Lucas1211的博客 3万+

leetcode322零钱兑换(背包问题)

背包问题转移方程总结,动态规划

s07aser123的专栏 958

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2395

【Leetcode 322】零钱兑换 —— 动态规划

我们可以使用**动态规划**解决本题,解题思路: 1. 状态定义:`dp[i]`为组成金额 i 所需最少的硬币数量 2. 状态转移方程:枚举 j,需要从dp[i - coins[j] 转移过来,再算上枚举的这枚硬币数量 1 的贡献,由于要硬币数量最少,所以 dp(i) 为前面能转移过来的状态的最小值加上枚举的硬币数量 1

若明天不见 993

当AI学会自我验证:Chain-of-Verification如何杜绝错误决策?

2025年,大模型"幻觉"问题已成为企业落地AI的最大障碍之一——金融风控中1.2%的误判率可能导致千万级损失,医疗诊断中3%的错误可能危及生命,法律文书中5%的事实偏差可能引发合规风险。MetaAI与Google联合提出的**Chain-of-Verification(CoVe,验证链)**技术,让AI具备"自我审视"能力,通过结构化验证流程将幻觉率降低68%+,在复杂决策场景准确率提升至95%+。本文系统拆解CoVe的技术原理、实施路径与行业实战,为企业提供AI决策可靠性保障的完整方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1083

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 901

322. 零钱兑换 ——【Leetcode每日一题】

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

weixin_43412762的博客 1762

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 420

(动态规划)LC 零钱兑换

问题 方法一:暴力法 使用dfs或者bfs遍历所有的零钱组合,如果遍历结果和超过amount则结束本次遍历,找到和等于amount的最短路径。未剪枝的情况下会超时,下面是dfs的写法 int minRs = Integer.MAX_VALUE; public int coinChange(int[] coins, int amount) { if(amount == 0) return 0; quickSort(coins,0,coins.l

Sirm23333 831

赛灵思KV260视觉AI套件实战:从模型到边缘部署全流程解析

边缘计算与AI推理加速是当前嵌入式系统和物联网领域的关键技术。其核心原理在于将计算任务从云端下沉至网络边缘的设备端,通过专用硬件加速器(如FPGA、ASIC或NPU)执行神经网络推理,从而显著降低延迟、减少带宽消耗并提升数据隐私性。这一技术为实时性要求高的应用场景(如工业视觉检测、智能安防、自动驾驶等)提供了关键支撑。以赛灵思(Xilinx)的Zynq UltraScale+ MPSoC平台为例,其集成了ARM处理器与可编程逻辑,通过预置的深度学习处理器单元(DPU)为卷积神经网络提供高效INT8加速。开发

weixin_28719225的博客 326

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 119

DFS+剪枝、DP(完全背包)、BFS:零钱兑换

LeetCode 322. 零钱兑换 这道题是综合性特别强的一个问题,在初次写的时候没多想,立马就暴力DFS,之后加了剪枝改进,才通过; 之后看了AcWing的背包视频,发现可以套用完全背包的思路; 然后来了兴趣,认真看了下评论区和题解区,发现能够使用BFS的思路,真是妙啊!遂记录一下。 一、DFS+剪枝 看到题,感觉和之前的子集、全排列、电话号码的字母组合等题目相近,二话不说直接开写。 int coinChange(vector<int>& coins, int amou

To the beyond and infinity! 820

Python3+PCAN-USB基于PCAN-Basic二次开发实现上位机功能

一、环境搭建 1.概述 本文主要是通过Python3与CAN总线工具PCAN-USB基于官方PCAN-Basic库实现CAN总线消息读写功能。 2.PCANBasic.py和PCANBasic.dll下载地址 https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip 3.Python安装 下载地址:https://www.p...

测试领域技术分享 5186

leetcode 322. 零钱兑换----完全背包套路解法详细再探

零钱兑换完全背包套路解法再探引言完全背包(朴素解法)无效状态的定义问题--顺带滚动数组优化完全背包(一维优化) 引言 leetcode 322. 零钱兑换本篇文章题解之前已经发过,但是对完全背包的解法只是模棱解释一番,今天再写一篇文章来详细探讨一下本题套用完全背包公式的解法 完全背包套路题目: leetcode 279. 完全平方数 LintCode 440 · 背包问题 III—完全背包问题 本人目前刷题数量较少,先列举两道,O(∩_∩)O哈哈~ 完全背包(朴素解法) 硬币相当于我们的物品,每种..

m0_53157173的博客 878

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

leetcode:322. 零钱兑换[完全背包]

【代码】leetcode:322. 零钱兑换[完全背包]

2301_81570594的博客 235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

qq_40472852的博客 785

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

完全背包最少类问题——322. 零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。思路:还是完全背包类问题,只是状态转移方程由max变成min。发现判断-1逻辑太多了,改成最大值就不用那么麻烦了。你可以认为每种硬币的数量是无限的。

m0_54283072的博客 343

力扣 322.零钱兑换 完全背包问题

力扣322 零钱兑换

a87117869的博客 356

leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板

leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板

热爱C++和golang的学生 1850

Leetcode 322. 零钱兑换(完全背包)

Leetcode 322. 零钱兑换(完全背包) 题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 1

专注如一的博客 594

leetcode-322 零钱兑换--完全背包问题

原题地址:https://leetcode.com/problems/coin-change/ 这个题目可以用dfs来写,但是很容易超时,需要剪枝。 dp中有经典的背包九讲,而此题目正好是一种完全背包的模型。 首先看完全背包模型: 有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品 的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的...

XueWang1的博客 1197

代码随想录算法训练营Day43 | 322. 零钱兑换、279. 完全平方数、139.单词拆分、多重背包理论基础

训练营day43:322. 零钱兑换、279. 完全平方数、139.单词拆分、多重背包理论基础

jiabao0520的博客 1032

动态规划篇-代码随想录算法训练营第三十五天| 完全背包问题,322. 零钱兑换,518.零钱兑换II,组合总和 Ⅳ

完全背包问题,322. 零钱兑换,518.零钱兑换II,组合总和 Ⅳ

m0_67804957的博客 1128

Day 42 || 322. 零钱兑换、 279.完全平方数、139.单词拆分、多重背包

还是完全背包问题,但是这个是求得最少使用量,那么先背包还是先物品无所谓,重点在初始化上,dp[0]是0,其他都是Integer.MAX_VALUE,更新就是dp[i] = Math.min(dp[i],dp[i-coin]+1),同时更新的时候要判断dp[i-coin]是否为Integer.MAX_VALUE,否则会变成Integer.MIN_VALUE。和“322. 零钱兑换”一样,只是在确定物品的时候先对n开方即可。

qq_43408590的博客 464

代码随想录Day 38|背包问题完结,题目322.零钱兑换、279.完全平方数、139,单词拆分数

关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组这五部里哪一步都很关键,但确定递推公式和确定遍历顺序都具有规律性和代表性递归公式:能否装满背包或最多装多少:用更新,如分割等和子集和最后一块石头的重量 II。装满背包的方法数:用。

LuckyYH__的博客 1255

代码随想录算法训练营Day33| LeetCode 322 零钱兑换、279 完全平方数、139 单词拆分、多重背包问题

代码随想录算法训练营第三十三天,动态规划之背包问题完结!

修炼途中的所见所闻,所思所想。 1406
上一篇: 5-最长回文子串
下一篇: 518-零钱兑换 II(完全背包)
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值