代码随想录算法训练营第四十六天|139.单词拆分、关于多重背包,你该了解这些!、背包问题总结篇!


一、139.单词拆分

    public boolean wordBreak(String s, List<String> wordDict) {
        //完全背包问题,因为可以重复,背包正序排列
        //排列问题,先遍历背包,再遍历物品
        boolean[] dp = new boolean[s.length()+1];//容量为j的背包,是否可以拼接出来
        Arrays.fill(dp,false);
        dp[0] = true;
        for(int j=0;j<=s.length();j++){//遍历背包
            for(int i=0;i<wordDict.size();i++){//遍历物品
                if(j>= wordDict.get(i).length()&&dp[j - wordDict.get(i).length()]&& s.substring(j - wordDict.get(i).length(), j).equals(wordDict.get(i))){
                    dp[j]=true;       
                }
                // if (j >= wordDict.get(i).length() && dp[j - wordDict.get(i).length()] && s.substring(j - wordDict.get(i).length(), j).equals(wordDict.get(i))) {
                //     dp[j] = true;
                //     // break;
                // }
                
            }
        }
        return dp[s.length()];
        
    }

11分钟

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

  • 自己看到题目的第一想法

  • 看完题解之后的想法

  • 自己实现过程中遇到的问题总结

46分钟

三、背包问题总结篇!

  1. 问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:
    动态规划:416.分割等和子集(opens new window)
    动态规划:1049.最后一块石头的重量 II(opens new window)

  2. 问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
    动态规划:494.目标和(opens new window)
    动态规划:518. 零钱兑换 II(opens new window)
    动态规划:377.组合总和Ⅳ(opens new window)
    动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

  3. 问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
    动态规划:474.一和零(opens new window)

  4. 问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
    动态规划:322.零钱兑换(opens new window)
    动态规划:279.完全平方数

  5. 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
    如果求排列数就是外层for遍历背包,内层for循环遍历物品。
    在这里插入图片描述

总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值