Leetcode322.零钱兑换(HOT100)

链接

代码:

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1,amount+1);//要兑换amount元硬币,我们就算是全选择1元的硬币,也不过是amount个,所以初始化amount+1(超过最坏答案即可
        dp[0] = 0;//要兑换0面值硬币需要硬币个数为0
        for(int i = 1;i<=amount;i++){
            for(int j = 0;j<coins.size();j++){
                if(i-coins[j]>=0)
                    dp[i] = min(dp[i],dp[i-coins[j]]+1);
            }
        }
        if(dp[amount]==amount+1)//如果这个位置的值与初始化的相同,那么说明,这里的值没别更新过,说明解不存在
            return -1;
        else
            return dp[amount];
    }
};

题解:

要解决这个问题,我们得模拟一下人类看到这个问题是怎么解决的?
比如coins[] = 1 3 4 5 amount = 7

要兑换7,我们可以先选一个1,这样我们的目标就变为兑换7-1也就是6了,要兑换6,我们继续选,比如选1,那么问题转为兑换6-1也就是5了,所以我们发现要求出来兑换amount,那么你得先把兑换amount-1,amount-2.........(一直到兑换0需要0个硬币)求出来,从而得到兑换amount。

所以问题转为填表:兑换0需要0个硬币,那么兑换1需要多少硬币?兑换2需要?兑换...........兑换amount需要多少硬币?

所以我们开一个amount+1长的数组,往进填值。

我们还发现:兑换1需要多少硬币这个子问题,我们不能随便选硬币,比如你选择了5面值,这显然错误,所以我们填表的时候要判断:你要兑换的硬币数减去选择的硬币面值<0则什么都不做,>=0才填表。

相关推荐
算法鑫探6 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue6 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5166 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX17 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白7 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin7 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449968 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf8 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer
Code-keys8 小时前
Android Codec2 Filter 算法模块开发指南
android·算法·音视频·视频编解码