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

 详细布置 

关于 多重背包,力扣上没有相关的题目,所以今天大家的重点就是回顾一波 自己做的背包题目吧。 

 139.单词拆分 

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

代码随想录

我写的(还没写对)

class Solution(object):
    def wordBreak(self, s, wordDict):
        dp=[0]*len(s)
        for num in wordDict:
            i=0
            while i<=len(s)-len(num)+1:
                if dp[i]==0 and s[i:i+len(num)]==num:
                    for _ in range(i,i+len(num)):
                        dp[_]=1
                    i+=len(num)-1
                i+=1

        if 0 not in dp:
            return True
        else:
            return False

答案

class Solution(object):
    def wordBreak(self, s, wordDict):
        wordSet = set(wordDict)
        n = len(s)
        dp = [False] * (n + 1)  # dp[i] 表示字符串的前 i 个字符是否可以被拆分成单词
        dp[0] = True  # 初始状态,空字符串可以被拆分成单词

        for i in range(1, n + 1): # 遍历背包
            for j in range(i): # 遍历单词
                if dp[j] and s[j:i] in wordSet:
                    dp[i] = True  # 如果 s[0:j] 可以被拆分成单词,并且 s[j:i] 在单词集合中存在,则 s[0:i] 可以被拆分成单词
                    break

        return dp[n]

总结

用我的方法写了半天也没有写出来。其实我应该先弄清楚这道题是排列再写的,这样就应该把遍历背包放在上面,我是遍历的总的单词,再遍历的单词然后一个一个对,从前往后对,而一般是要从后往前对的,这样遍历时才不会重复。

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

代码随想录

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

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

总结:我觉得记住这些就够了。

 背包问题总结篇! 

代码随想录

算法随想录第四十六天打卡|139.单词拆分 ,关于多重背包,你该了解这些! , 背包问题总结篇!_第1张图片

总结

我觉得背包问题可分为dp的定义,初始值,遍历顺序,公式,四部分。

你可能感兴趣的:(算法)