当前位置: 首页 > news >正文

代码随想录算法训练营第38天 | 322. 零钱兑换 279.完全平方数 139.单词拆分 背包问题总结

322. 零钱兑换

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

钱币有顺序和没有顺序都可以,都不影响钱币的最小个数

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

代码随想录

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount == 0)return 0;
        int bagSize = amount;
        int[] dp = new int[amount + 1];
        Arrays.fill(dp,Integer.MAX_VALUE);//后面要取最小值,初始值都要设成最大
        
        dp[0] = 0;
        for(int i = 0;i <= bagSize;i++){
            for(int j = 0;j < coins.length;j++){
                if(i >= coins[j] && dp[i - coins[j]] != Integer.MAX_VALUE){
                    dp[i] = Math.min(dp[i],dp[i - coins[j]] + 1);//初始值加一会越界
                }
            }
        }
        if(dp[amount] == Integer.MAX_VALUE)return -1;
        return dp[amount];
    }
}

279.完全平方数

279. 完全平方数 - 力扣(LeetCode)

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

代码随想录

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0] = 0;
        dp[1] = 1;
        
        for(int i = 1;i*i <= n;i++){
            int s = i * i;
            for(int j = s;j <= n;j++){
                if(dp[j - s] != Integer.MAX_VALUE){
                    dp[j] = Math.min(dp[j],dp[j - s] + 1);
                }
            }
        }
        return dp[n];
    }
}

139.单词拆分

视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili

代码随想录

dp[i]代表,数组元素是否能够组成长度为i时的s

完全背包,正序遍历

对顺序有要求,先背包再物品

递推公式:若前面的字符串可以被组合出来,同时后面的字符串也在数组元素里

int len = word.length();
                if(i >= len && dp[i - len] && set.contains(s.substring(i - len,i))){
                    dp[i] = true;
                    break;
                }

初始化:dp[0] = true;

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> set = new HashSet<>(wordDict);
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;
        for(int i = 1;i < s.length() + 1;i++){
            for(String word:set){
                int len = word.length();
                if(i >= len && dp[i - len] && set.contains(s.substring(i - len,i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];

    }
}

关于多重背包,你该了解这些!

56. 携带矿石资源(第八期模拟笔试)

代码随想录

转化为01背包

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int bagSize,n;
        bagSize = sc.nextInt();
        n = sc.nextInt();
        int[] weight = new int[n];
        int[] value = new int[n];
        int[] nums = new int[n];
        for(int i = 0;i < n;i++)weight[i] = sc.nextInt();
        for(int i = 0;i < n;i++)value[i] = sc.nextInt();
        for(int i = 0;i < n;i++)nums[i] = sc.nextInt();

        int[] dp = new int[bagSize + 1];
        for(int i = 0;i < n;i++){
            for(int j = bagSize;j >= weight[i];j--){
                for(int k = 1;k <= nums[i];k++){
                    if(j >= k * weight[i])dp[j] = Math.max(dp[j],dp[j - k * weight[i]]
                    + k * value[i]);
                }
            }
        }    
        
        System.out.println(dp[bagSize]);

    }
}

背包问题总结

代码随想录

五部曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

背包递推公式

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); 

问装满背包有几种方法:dp[j] += dp[j - nums[i]] 

问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 

问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); 

遍历顺序

01背包

二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。

完全背包

纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

但是仅仅是纯完全背包的遍历顺序是这样的,题目稍有变化,两个for循环的先后顺序就不一样了。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

如果求最小数,那么两层for循环的先后顺序就无所谓了

相关文章:

  • “跨越时代的技术进步:CPU缓存如何塑造了智能手机和智能家居的未来?
  • 【2025】基于ssm+jsp的二手商城系统设计与实现(源码、万字文档、图文修改、调试答疑)
  • go-zero学习笔记
  • 第39章:CSI插件开发与定制化存储需求
  • Django框架视图与路由(一)
  • 我的Go学习路线概览
  • 关于 URH(Universal Radio Hacker) 的详细介绍、安装指南、配置方法及使用说明
  • Java 的 AutoCloseable 接口
  • 警翼(Pe)执法记录仪格式化后的恢复方法
  • 分类预测 | Matlab实现BO-GRU-Attention贝叶斯优化门控循环单元融合注意力机制多特征分类预测
  • 【系统稳定性】1.13 解析gcore
  • 京东一面:MySQL 主备延迟有哪些坑?主备切换策略
  • 【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
  • 运功学-【机械臂】
  • 1.设备电气设计、装配的注意事项
  • C语言入门教程100讲(19)do-while 循环
  • 动态规划完全背包系列一>完全平方数
  • android......
  • Python学习笔记(4)
  • MySQL 锁机制详解
  • 美“群聊泄密门”始作俑者沃尔兹将离职
  • 五一去哪玩?“时代交响”音乐会解锁艺术假期
  • 体坛联播|欧冠巴萨3比3战平国米,柯洁未进入国家集训队
  • 排除燃气爆炸、人为放火可能,辽宁辽阳火灾事故起火原因正在调查
  • “ChatGPT严选”横空出世了,“DeepSeek严选”还要等多久?
  • “光荣之城”2025上海红色文化季启动,红色主题市集亮相