动态规划 Leetcode 322 零钱兑换

零钱兑换

Leetcode 322

学习记录自代码随想录

要点:1.背包容量为amount,物品重量为coins[i],物品价值为1;

2.因为求最小值递推公式为 d p [ j ] = m i n ( d p [ j ] , d p [ j − c o i n s [ i ] ] + 1 ) dp[j] = min(dp[j], dp[j-coins[i]]+1) dp[j]=min(dp[j],dp[j−coins[i]]+1);

3.dp数组初始化,因为是min所以dp[0] = 0, 其余值初始化为UINT_MAX;

4.在迭代判断时要跳过dp[j-coins[i]] == INT_MAX这种情况,并且此时也没有比较的必要,但是不能不加这个条件,因为UINT_MAX+1会回滚到0导致迭代出错;

c 复制代码
unsigned int min(unsigned int a, unsigned int b){
    return a < b ? a : b;
}

int coinChange(int* coins, int coinsSize, int amount) {

    if(amount == 0) return 0;
    
    // int sum = 0;
    // for(int i = 0; i < coinsSize; i++) sum += coins[i];

    // 1.dp[j]代表凑成总金额为j(背包容量)时所需的最少的硬币个数, 物品重量为coins[i], 物品价值为1
    unsigned int dp[amount+1];
    memset(dp, UINT_MAX, sizeof(dp));
    // memset(dp, 0, sizeof(dp));
    
    // 2.递推公式:dp[j] = max(dp[j], dp[j-coins[i]] + 1)
    // 3.dp数组初始化为UINT_MAX
    dp[0] = 0;
    // 4.遍历顺序,每个物品可以无限拿,所以先物品再背包, 均为正向遍历
    for(int i = 0; i < coinsSize; i++){
        for(int j = coins[i]; j < amount+1; j++){
            // 如果dp[j-coins[i]]为UINT_MAX,则UINT_MAX+1会重新变为0导致整体迭代会出错需要注意!
            if(dp[j-coins[i]] != UINT_MAX){  
                dp[j] = min(dp[j], dp[j-coins[i]] + 1);
            }
        }
    }
    // 5.举例推导dp数组
    if(dp[amount]) return dp[amount];
    return -1;

}
相关推荐
圣保罗的大教堂10 分钟前
leetcode 1855. 下标对中的最大距离 中等
leetcode
智者知已应修善业1 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.5482 小时前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove2 小时前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊2 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
code_pgf4 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃4 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__4 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy4 小时前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超4 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划