• 代码随想录算法训练营第四十六天 | 139. 单词拆分 & 背包小结


    1. 单词拆分

    139. 单词拆分 - 力扣(LeetCode)

    1. class Solution {
    2. public boolean wordBreak(String s, List wordDict) {
    3. //背包 s
    4. //物品 从s中截取出来的字串,看在不在dict里
    5. HashSet set = new HashSet<>(wordDict);
    6. //dp[j] 前j个字母能否被拼接
    7. boolean[] dp = new boolean[s.length() + 1];
    8. dp[0] = true;
    9. // 有顺序 先背包
    10. for(int j = 1; j <= s.length();j++){ // 背包 0-j
    11. for(int i = 0; i < j && !dp[j]; i++){ // 物品 从背包中截取
    12. //dp[j]已经为 true 的可以不用判断了
    13. String temp = s.substring(i, j); // i-j
    14. if(set.contains(temp) && dp[i]) // 0-i 可以 i-j可以
    15. dp[j] = true; // 0-j 才可以
    16. }
    17. }
    18. return dp[s.length()];
    19. }
    20. }

    2. 小结

    代码随想录

    能否能装满背包(或者最多装多少):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]);

    2.1 01背包:

    二维dp数组

    先遍历物品还是先遍历背包都是可以的

    且第二层for循环是从小到大遍历

    一维dp数组

    只能先遍历物品再遍历背包容量 (在必须倒序的情况下,如果先背包 dp[j]前面都是 0,就是确定了一个容量,看每一个物品value[i]能否放下,这样背包只会放一个物品)

    且第二层for循环倒序遍历(后一个值由前一个推出,如果顺序,前一个已经处理了再处理后一个,会把前面放过的再放一次)

    2.2 完全背包

    先遍历物品还是先遍历背包都是可以的 (因为背包正序了,dp[j]前面都是操作过的了)

    且第二层for循环是正序遍历(放过的的可以再放)

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

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

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

  • 相关阅读:
    给Android第三方SDK传入代理Context
    debian unbtun 安装jdk
    [U3D ShaderGraph] 全面学习ShaderGraph节点 | 第三课 | Input/Gradient
    AI视频下载:零基础2小时学会开发 Chrome扩展程序
    【技术积累】Mysql中的SQL语言【技术篇】【四】
    Linux线程互斥
    Python编程 元组中不允许的操作
    CSS-vmin&vmax单位
    Java常用类的使用
    代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
  • 原文地址:https://blog.csdn.net/weixin_50815909/article/details/133203497