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

文章目录

  • 一、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循环遍历物品。

总结

你可能感兴趣的:(算法,java,开发语言)