动态规划Day08(背包结束,未写完)

这篇具有很好参考价值的文章主要介绍了动态规划Day08(背包结束,未写完)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

139.单词拆分(需要重新写)

力扣题目链接(opens new window)

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。

你可以假设字典中没有重复的单词。

示例 1:

  • 输入: s = "leetcode", wordDict = ["leet", "code"]
  • 输出: true
  • 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

  • 输入: s = "applepenapple", wordDict = ["apple", "pen"]
  • 输出: true
  • 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
  • 注意你可以重复使用字典中的单词。

示例 3:

  • 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
  • 输出: false
看到题目的第一想法

        使用背包,但是不知道这些字符串要怎么处理比较好

看到代码随想录之后的想法

        这是求排列数,判断[i,j] 是否有匹配的字符串,有则为true

        while的条件

        代码随想录中的实现是  while(i>=len&&dp[i-len]==true&&word.equals(s.subString(i-len,i)))

自己实现过程中遇到的困难

        dp[i]代表当前位置是否可以用word来表示

        while的条件

        代码随想录中的实现是  while(i>=len&&dp[i-len]==true&&word.equals(s.subString(i-len,i)))

        dp[0]对应空串,其他的都是一一对应

        要注意 boonlean数组的定义为new boolean[s.length()+1] 我定义成s.length()了 

        同时遍历字符串时,i<=s.length  我写的时候没有加=号

        return 也是dp[s.length()]

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        //dp数组的定义和下标的含义
        //若当前位置能被wordic种的字典拼出则为true ,否则为false
        //确定递推公式
        // if([i,j]是wordDict,且i 为true)
        // 则dp[j]=true
        //dp数组初始化
        //dp[0] = true
        //确定遍历顺序
        //求的排列数,要先背包后物品
        //从前往后,一个单词可以重复出现,完全背包
        //举例推导dp数组
        //s.length()+1
        //dp[0]代表空串一定为true
        //dp[i] 代表0~i是否能用字典表示
        boolean[] dp = new boolean[s.length()+1]; 
        
        for(int i=0;i<dp.length;i++){
            dp[i]=false;
        }
        dp[0] = true;
        /*for(int i=0;i<s.length();i++){
            for(String word:wordDict){
                int len = word.length();
                int j = i+len;
                //这里应该是j-i,j
                if(dp[i]==true&&word.equals(s.substring(j-i,j))){
                    dp[j]=true;
                }
            }
        }*/
        //这里是<=
        for(int i=1;i<=s.length();i++){
            for(String word:wordDict){
                int len = word.length();
                //这里应该是i-len,i
                if(i>=len&&dp[i-len]==true&&word.equals(s.substring(i-len,i))){
                    dp[i]=true;
                }
            }
        }
        //应该是length+1
        return dp[s.length()];

    }
}

   背包问题总结

        动态规划Day08(背包结束,未写完),动态规划,算法

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

  • 动态规划:416.分割等和子集(opens new window)
  • 动态规划:1049.最后一块石头的重量 II(opens new window)

        最多装多少,or是否能装满,是求在目标背包容量能容纳的最大的value,则需要去根据当前的物品来进行比较Math.max(dp[j],dp[j-weight[i]]+value[i]);

问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:

  • 动态规划:494.目标和(opens new window)
  • 动态规划:518. 零钱兑换 II(opens new window)
  • 动态规划:377.组合总和Ⅳ(opens new window)
  • 动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

        装满背包有多少种方法?则需要累计能装满背包的方法的个数,若当前为nums[i],则dp[j]+=dp[j-nums[i]],凑成j需要去找dp[j-nums[i]]有多少个

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

  • 动态规划:474.一和零(opens new window)​​​​​​

        这道题涉及到了二维数组,背包是二维的,[m,n] dp[i][j] = Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)

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

  • 动态规划:322.零钱兑换(opens new window)
  • 动态规划:279.完全平方数

        求的是和之前比的最小值 dp[j] = Math.min(dp[j],dp[j-nums[i]]+1);

遍历顺序

01背包

在动态规划:关于01背包问题,你该了解这些! (opens new window)中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

和动态规划:关于01背包问题,你该了解这些!(滚动数组) (opens new window)中,我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。

一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,大家需要注意!

#完全背包

说完01背包,再看看完全背包。

在动态规划:关于完全背包,你该了解这些! (opens new window)中,讲解了纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

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

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

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

相关题目如下:

  • 求组合数:动态规划:518.零钱兑换II(opens new window)
  • 求排列数:动态规划:377. 组合总和 Ⅳ (opens new window)、动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

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

  • 求最小数:动态规划:322. 零钱兑换 (opens new window)、动态规划:279.完全平方数(opens new window)

对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了文章来源地址https://www.toymoban.com/news/detail-792021.html

到了这里,关于动态规划Day08(背包结束,未写完)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣算法刷题Day42|动态规划:01背包问题 分割等和子集

    力扣题目:01背包问题(二维数组) 刷题时长:参考题解 解题方法:动态规划 + 二维dp数组 复杂度分析 时间 空间 问题总结 理解递推公式困难 本题收获 动规思路:两层for循环,第一层i遍历物品,第二层j枚举背包容量以内所有值 确定dp数组及下标的含义:dp[i][j] 表示从下标

    2024年02月13日
    浏览(62)
  • 算法 DAY44 动态规划6 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

    有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 动规五步曲来分

    2024年02月01日
    浏览(53)
  • 力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

    力扣题目:#518.零钱兑换II(完全背包组合问题) 刷题时长:7min 解题方法:动态规划(完全背包) 复杂度分析 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 空间复杂度: O(m) 问题总结 对递推公式的理解 本题收获 题意转换:纯完全背包是凑成背包最大价值是多少,而本

    2024年02月13日
    浏览(42)
  • 算法 DAY45 动态规划07 70. 爬楼梯 322. 零钱兑换 279. 完全平方数 139. 单词拆分 多重背包

    和377. 组合总和 Ⅳ (opens new window)基本就是一道题了。 本题代码不长,题目也很普通,但稍稍一进阶就可以考察完全背包 动态规划五部曲 1、确定dp[j]的含义 dp[j] 凑成 j 的最少硬币的个数 2、确定递推公式 比如想凑成3, 如果手里有1,那么最小个数就是dp[2]+1 如果手里有2,那

    2024年02月02日
    浏览(61)
  • 【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II)

    力扣题目链接(opens new window) 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3

    2023年04月19日
    浏览(47)
  • 动态规划day05(背包问题)

    力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x = y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎; 如果 x !=

    2024年01月17日
    浏览(37)
  • 动态规划day04(01背包问题)

    01背包问题(二维数组和滚动数组) 本题力扣上没有原题,大家可以去卡码网第46题 (opens new window)去练习,题意是一样的。 《代码随想录》算法视频公开课 (opens new window):带你学透0-1背包问题! (opens new window),相信结合视频再看本篇题解,更有助于大家对本题的理解 。 这周

    2024年01月18日
    浏览(41)
  • 【tensorflow&flutter&web】机器学习模型怎样用到前端上(未写完)

            在上一章 我们谈了怎么根据项目需求构建一个简单的机器学习模型。      ​​​​​​ ​​​​​​【tensorflowflutter】自己写个机器学习模型用在项目上?-CSDN博客 文章浏览阅读852次,点赞22次,收藏15次。【tensorflowflutter】自己写个机器学习模型用在项目上?

    2024年01月24日
    浏览(48)
  • 【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II--求组合、组合总和IV--求排列)

    力扣题目链接(opens new window) 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3

    2023年04月19日
    浏览(42)
  • Leetcoder Day39| 动态规划part06 完全背包问题

    有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品都有无限个(也就是可以放入背包多次) ,求解将哪些物品装入背包里物品价值总和最大。 示例: 背包最大重量为4。 物品为: 重量 价值 物品0 1 15 物品1 3 20 物品2 4 30 每

    2024年03月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包