【代码随想录二刷】Day46-动态规划-Go

代码随想录二刷Day46

今日任务

139.单词拆分
多重背包
语言:Go

139. 单词拆分

链接:https://leetcode.cn/problems/word-break/

func wordBreak(s string, wordDict []string) bool {
    wordMap := make(map[string]bool)
    for i := 0; i < len(wordDict); i++ {
        wordMap[wordDict[i]] = true
    }
    dp := make([]bool, len(s) + 1)
    dp[0] = true
    //dp[j]为true时表示字符串的前j个字符串可以有字符串列表中的字符串组成
    //外层遍历背包,内层检查
    //这样可以保证每个背包在判断的时候都能充分利用物品
    //比如对于applepenapple来说,顺序必须是applepenapple
    //apple+apple+pen和pen+apple+apple都是不可以的
    for i := 1; i <= len(s); i++ { //外层遍历背包
        for j := 0; j < i; j++ { //内层检查
            //dp[j]表示s[0~j-1]可以由字符串列表中的字符串组成
            //所以接下来只需要判断s[j~i-1]是否可以由字符串列表中的字符串组成
            //这个循环里的i,表示的是当前在字符串s的第几个位置(下标加1)
            if dp[j] && wordMap[s[j:i]] { //这里算是遍历物品吧
                dp[i] = true
                break
            }
        }
    }
    return dp[len(s)]
}

多重背包

  1. 定义:有N种物品和容量为V的背包,第i种物品最多有Mi件可用,每件耗费的空间是Ci,价值是Wi,求解将哪些物品装入背包可使这些物品的耗费空间总和不超过背包容量,且价值总和最大。
  2. 本质:多重背包就是01背包的进阶版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值