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

网站服务器租用的淘宝客seo推广教程

网站服务器租用的,淘宝客seo推广教程,北大荒建设集团网站,个人做网站犯法吗完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

完全背包

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件

假设背包最大重量为4。物品为:

重量价值
物品0115
物品1320
物品2430

每件商品都有无限个。

因此在01背包中,我们为了使每件物品只被加入背包一次,在内层遍历的时候我们选择了倒序遍历。但是在完全背包中,物品的数量是无限的,因此可以被添加多次,所以要从小到大去遍历。

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}

其实还有一个很重要的问题,为什么遍历物品在外层循环,遍历背包容量在内层循环?

01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。

在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!

因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。

遍历物品在外层循环,遍历背包容量在内层循环,状态如图:

遍历背包容量在外层循环,遍历物品在内层循环,状态如图:

 

看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。

 518. 零钱兑换II

题目要求:给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

示例 1:

  • 输入: amount = 5, coins = [1, 2, 5]
  • 输出: 4

解释: 有四种方式可以凑成总金额:

  • 5=5
  • 5=2+2+1
  • 5=2+1+1+1
  • 5=1+1+1+1+1

思路

完全背包问题,容量就是amount,物品是coins。dp[i]表示组成i大小背包容量的方式数量。同时题目中强调凑成总金额的是组合,所以不强调元素之间的顺序。

状态转移方程就是:dp[i] += dp[j-coins[i]],与昨天遇到的题目相同。

这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇494. 目标和 (opens new window)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];

class Solution {
public:int change(int amount, vector<int>& coins) {vector<int> dp(amount+1, 0);dp[0] = 1;for (int i = 0; i < coins.size(); ++i) {for (int j = coins[i]; j <= amount; ++j) {dp[j] += dp[j - coins[i]];}}return dp[amount];}
};

377. 组合总和 Ⅳ

题目要求:给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

示例:

  • nums = [1, 2, 3]
  • target = 4

所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)

请注意,顺序不同的序列被视作不同的组合。

因此输出为 7。

思路

与上一个题目类似,但是本题是排序,强调序列的顺序。而上一个题目是组合,不强调顺序。

  • 确定遍历顺序

个数可以不限使用,说明这是一个完全背包。

得到的集合是排列,说明需要考虑元素之间的顺序。

本题要求的是排列,那么这个for循环嵌套的顺序可以有说法了。、

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

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

如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!

所以本题遍历顺序最终遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target+1, 0);dp[0] = 1;for (int i = 0; i <= target; ++i) { // 遍历背包for (int j = 0; j < nums.size(); ++j) { // 遍历物品if (i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]) {dp[i] += dp[i - nums[j]];}}}return dp[target];}
};
  • 时间复杂度: O(target * n),其中 n 为 nums 的长度
  • 空间复杂度: O(target)

C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

  • Day43总结
  • 背包问题的遍历顺序是一门学问,01背包物品只能用一次外层是物品内层倒叙是容量;
  • 完全背包的组合问题不强调顺序,物品可以用无限次,外层是物品,内层是背包容积的正序;
  • 完全背包的排列问题,强调顺序,外层是背包容积,内层是物品,这样大编号的物品也可以出现在前面。
http://www.mmbaike.com/news/34172.html

相关文章:

  • 网站维护的注意事项软件推广平台有哪些?哪个比较好
  • 宁波企业网站制作公司百度客服人工在线咨询
  • 计算机类哪个专业前景好青岛seo服务
  • 求职网站建设方案哈尔滨百度网络推广
  • 最专业的网站建设公司哪家好慧生活798app下载
  • 网站建设服务器端软件营销网络的建设有哪些
  • 山东做网站建设公司哪家好刷关键词的平台
  • 建设银行的英语网站拼多多关键词优化步骤
  • 网站建设中gif优化网站内容
  • 长沙网站微信开发免费模板素材网站
  • 北京建设职工大学网站免费网址注册
  • wordpress数字链接出现404seo成功案例分析
  • 北京价格微网站建设东莞搜索引擎推广
  • 广告公司做网站的效果怎么样搜索关键词站长工具
  • 拿p5.js做的网站手机百度网页版 入口
  • 企业展示型网站源码优化大师网页版
  • wordpress虚拟币主题天津seo排名收费
  • 网站流量劫持怎么做谷歌搜索引擎入口2022
  • 百家号网站开发属于什么领域东莞网站建设推广
  • 网站建设放电影怎么做下载百度2023最新版安装
  • 南皮做网站价格昆明关键词优化
  • 做那种事的网站抖音seo软件
  • 记事本里做网站 怎么把字体做企业推广
  • 网站上facebook怎么做链接中国四大软件外包公司
  • 网站如何设置二级域名每日一则小新闻
  • 汽车网站设计论文seo网站优化是什么
  • 男的做那个视频网站网站seo公司哪家好
  • 网站服务器管理系统百度怎么推广
  • 怎么让网站能被百度到学电脑培训班
  • 框架做网站指的是磁力帝