算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)

简介: 算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)

💕"这种低水平质量的攻击根本就不值得我躲!"💕

作者:Lvzi

文章主要内容:算法系列–动态规划–背包问题(4)–完全背包拓展题目

大家好,今天为大家带来的是算法系列--动态规划--背包问题(4)--完全背包拓展题目

一.零钱兑换

链接:

https://leetcode.cn/problems/coin-change/submissions/517819340/

分析:

本题就是一个完全背包问题的体现,完全背包问题最大的特点就是物品的数量是无限制的,在本题中硬币的数量也是无限制的,所以本题依旧可以采用动态规划的思想解决

状态表示:

  • dp[i][j]:在[1,i]区间内的硬币中选择,实现总额为j元的最小硬币组合数

状态转移方程:

初始化:

由于可能无法使用一定组合的硬币实现j元,此时的状态应该为-1,在选择nums[i]这种情况下,为了不使用无效的数据所以我们需要特殊判断一下,目的是不使用无效的数据,那么只要在填表的时候无效数据不会被使用到即可,这里我们求的是两种情况的最小值,如果不想使用无效数据,可以将无效数据设置为0x3f3f3f3f,这样无效数据对我们的初始化就没有影响了

代码:

class Solution {
    public int coinChange(int[] coins, int amount) {
        int n = coins.length;
        int[][] dp = new int[n + 1][amount + 1];// 创建dp表
        for(int j = 1; j <= amount; j++) dp[0][j] = 0x3f3f3f3f;// 初始化为最大值 
        for(int i = 1; i <= n; i++) {
            for(int j = 0; j <= amount; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - coins[i - 1] >= 0)// 不能超过最大容量
                    dp[i][j] = Math.min(dp[i][j],dp[i][j - coins[i - 1]] + 1);
            }
        }
        // 注意这种恰好等于的背包问题  最后的返回值一定要特判一下
        return dp[n][amount] == 0x3f3f3f3f ? -1 : dp[n][amount];
    }
}

空间优化:

class Solution {
    public int coinChange(int[] coins, int amount) {
        int n = coins.length;
        int[] dp = new int[amount + 1];// 创建dp表
        for(int j = 1; j <= amount; j++) dp[j] = 0x3f3f3f3f;// 初始化为最大值 
        for(int i = 1; i <= n; i++)
            for(int j = coins[i - 1]; j <= amount; j++)
                dp[j] = Math.min(dp[j],dp[j - coins[i - 1]] + 1);
        // 注意这种恰好等于的背包问题  最后的返回值一定要特判一下
        return dp[amount] == 0x3f3f3f3f ? -1 : dp[amount];
    }
}

思考的难点:

  1. 如何通过设置无效的数据来进行初始化,在选nums[i]这种情况时,我们之所以要判断一下是为了不使用符合该条件的数据(无效数据 -1),我们这里求的是最小值,只需要保证在填数据的时候不使用就行,那么就可以将无效数据设置为最大值,这样就不会使用到无效数据了

算法系列--动态规划--背包问题(4)--完全背包拓展题目(下)https://developer.aliyun.com/article/1480861?spm=a2c6h.13148508.setting.16.352e4f0ecxYhMg

目录
相关文章
|
1天前
|
算法 C语言
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-2
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
1天前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
3天前
|
机器学习/深度学习 存储 算法
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
9 1
|
23天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
34 1
|
1月前
|
算法
算法系列--动态规划--特殊的状态表示--分析重复子问题(下)
算法系列--动态规划--特殊的状态表示--分析重复子问题(下)
14 0
|
1月前
|
算法
算法系列--动态规划--特殊的状态表示--分析重复子问题(上)
算法系列--动态规划--特殊的状态表示--分析重复子问题
18 0
|
1月前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
14 0
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
3天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。
|
3天前
|
算法 Serverless
m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
MATLAB 2022a仿真实现了遗传优化的归一化最小和(NMS)译码算法,应用于低密度奇偶校验(LDPC)码。结果显示了遗传优化的迭代过程和误码率对比。遗传算法通过选择、交叉和变异操作寻找最佳归一化因子,以提升NMS译码性能。核心程序包括迭代优化、目标函数计算及性能绘图。最终,展示了SNR与误码率的关系,并保存了关键数据。
12 1