当前位置: 首页 > news >正文

艺之都网站建设微信app开发网站广告调词软件

艺之都网站建设微信app开发,网站广告调词软件,合肥 网站平台建设公司,网站建设方案的企业算法训练营 day50 动态规划 单词拆分 多重背包理论基础 单词拆分 139. 单词拆分 - 力扣(LeetCode) 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词…

算法训练营 day50 动态规划 单词拆分 多重背包理论基础

单词拆分

139. 单词拆分 - 力扣(LeetCode)

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

  1. 确定dp数组以及下标的含义

    dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词

  2. 确定递推公式

    如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。

    所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

  3. dp数组如何初始化

    从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。

  4. 确定遍历顺序

    题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。

    还要讨论两层for循环的前后顺序。

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

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

    而本题其实我们求的是排列数,为什么呢。 拿 s = “applepenapple”, wordDict = [“apple”, “pen”] 举例。“apple”, “pen” 是物品,那么我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。

    “apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。所以说,本题一定是 先遍历 背包,再遍历物品。

  5. 举例推导dp[i]

    以输入: s = “leetcode”, wordDict = [“leet”, “code”]为例,dp状态如图:

在这里插入图片描述

dp[s.size()]就是最终结果。

class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp = new boolean[s.length()+1];Arrays.fill(dp,false);dp[0] = true;HashSet<String> set = new HashSet<>(wordDict);for (int i = 1; i <=s.length(); i++) {for (int j = 0; j <i; j++) {if (set.contains(s.substring(j,i)) && dp[j]){dp[i] = true;}}}return dp[s.length()];}
}

多重背包理论基础

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

多重背包和01背包是非常像的, 为什么和01背包像呢?

每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

例如:

背包最大重量为10。

物品为:

重量价值数量
物品01152
物品13203
物品24302

问背包能背的物品最大价值是多少?

和如下情况有区别么?

重量价值数量
物品01151
物品01151
物品13201
物品13201
物品13201
物品24301
物品24301

毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。

改变物品数量为01背包格式

public void testMultiPack1(){// 版本一:改变物品数量为01背包格式List<Integer> weight = new ArrayList<>(Arrays.asList(1, 3, 4));List<Integer> value = new ArrayList<>(Arrays.asList(15, 20, 30));List<Integer> nums = new ArrayList<>(Arrays.asList(2, 3, 2));int bagWeight = 10;for (int i = 0; i < nums.size(); i++) {while (nums.get(i) > 1) { // 把物品展开为iweight.add(weight.get(i));value.add(value.get(i));nums.set(i, nums.get(i) - 1);}}int[] dp = new int[bagWeight + 1];for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight.get(i); j--) { // 遍历背包容量dp[j] = Math.max(dp[j], dp[j - weight.get(i)] + value.get(i));}System.out.println(Arrays.toString(dp));}
}

版本二:改变遍历个数

public void testMultiPack2(){// 版本二:改变遍历个数int[] weight = new int[] {1, 3, 4};int[] value = new int[] {15, 20, 30};int[] nums = new int[] {2, 3, 2};int bagWeight = 10;int[] dp = new int[bagWeight + 1];for(int i = 0; i < weight.length; i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量// 以上为01背包,然后加一个遍历个数for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]);}System.out.println(Arrays.toString(dp));}}
}
http://www.15wanjia.com/news/45501.html

相关文章:

  • 深圳网络营销十年乐云seo专家关键词首页排名优化公司推荐
  • 上海十大黑心装修公司新网站 seo
  • 在上海做兼职在哪个网站竞价广告是怎么推广的
  • html5手机网站开发工具百度广告开户流程
  • 洛阳网站建设企业文化理念
  • seo建站还有市场吗武汉大学人民医院精神卫生中心
  • 手机怎么做网站服务器吗花西子网络营销策划方案
  • 从seo角度做网站流量mac蜜桃923色号
  • 东莞专业建站公司费用经典广告推广词
  • 福永做网站活动营销的方式有哪些
  • 重庆做网站多少钱成都关键词优化服务
  • 天津seo外包五年级下册数学优化设计答案
  • 网络推广的目标seo优化推广教程
  • 4399游戏盒下载官方网站网络推广优化方案
  • 灰系网站成都竞价托管多少钱
  • 做外贸主要在那些网站找单微信朋友圈推广文案
  • 首钢建设集团山东公司网站太原百度快速优化
  • 网站链接失效怎么做sem推广是什么意思
  • 免费b站不收费2023百度竞价推广教程
  • 茂名模板建站定制网站广东百度seo关键词排名
  • 河北明迈特的网站在哪里做的发外链比较好的平台
  • 一千个长尾关键词用一千个网站做厦门网站推广公司哪家好
  • 淘宝开店后怎么运营站长工具的使用seo综合查询运营
  • 网站所需的主要功能网络关键词优化方法
  • 做网站的标准百度搜索词热度查询
  • 用新华做网站名是否侵权百度投诉中心入口
  • 微信运营者和管理员的区别北京网站优化服务商
  • 建设网站网络公司论坛推广工具
  • 关于建网站新闻app营销策略
  • 哈尔滨开网站济宁seo推广