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

做flash网站遇到函数诊断网站seo现状的方法

做flash网站遇到函数,诊断网站seo现状的方法,织梦整形医院网站开发,南昌网站seo 优帮云目标和 题目 给一个都是正整数的组合,然后你可以在里面任意添加或-,求使得最后结果为 目标和S(target)的有多少种方法? 范围 数组非空,且长度不会超过 20 。初始的数组的和不会超过 1000 。保证返回的…

目标和

题目

给一个都是正整数的组合,然后你可以在里面任意添加+或-,求使得最后结果为

目标和S(target)的有多少种方法?

范围

  • 数组非空,且长度不会超过 20 。
  • 初始的数组的和不会超过 1000 。
  • 保证返回的最终结果能被 32 位整数存下。

思路

用背包方法的话,这是怎么带入背包方法的?任意添加+或-后会分成两个组合

+是left(总和),-是right(总和),如果结果为目标和target的话,sum=left+right(总和),target=left-right(目标和),推出right=left-target 推出sum=left+(left-target)最后推出 left=(target+sum)/2,利用target和sum都确定这一点,可以求出+的组合left来。

带入背包问题

假设加法的总和为x(left),那么减法对应的总和就是sum - x。

所以我们要求的是 x - (sum - x) = target

x = (target + sum) / 2

此时问题就转化为,装满容量为x的背包,有几种方法。

这个时候装满了容量为x的背包相当于,任意+或者-之后的目标值被满足了。

这里如果x = (target + sum) / 2没有被整除,说明最后目标值不能为target,说明没有方案

同时如果 S的绝对值大于sum,那么也没有方案

递推公式

dp[j] += dp[j - nums[i]]

dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法,nums[i]是那个都是正整数的组合的第i个数,方法不同的方法就不考虑放还是不放了,都放进去,然后累加起来。比如

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
  • 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
  • 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
  • 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包
  • 他们的dp[1-5]种方法都加起来。

初始化

dp[0]=1,为什么?不知道,按定义来,容量为0的背包的最大方法数为1,+0和-0是一种方法吗?总之dp[0]=1能通过

总代码

class Solution {
public:int findTargetSumWays(vector<int>& nums, int S) {int sum = 0;for (int i = 0; i < nums.size(); i++) sum += nums[i];if (abs(S) > sum) return 0; // 此时没有方案if ((S + sum) % 2 == 1) return 0; // 此时没有方案int bagSize = (S + sum) / 2;vector<int> dp(bagSize + 1, 0);dp[0] = 1;for (int i = 0; i < nums.size(); i++) {for (int j = bagSize; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[bagSize];}
};

这题也挺抽象的

一和零

题目

给一个元素只由0和1组成的集合strs,再给两个正整数m和n,要求找出最多有m个0和n个1的集合strs的子集,同时这个子集的元素最多。

示例 :

  • 输入:strs = ["10", "0", "1"], m = 1, n = 1
  • 输出:2
  • 解释:最大的子集是 {"0", "1"} ,所以答案是 2 。

思路

带入背包问题,相当于把strs的每个元素作为物品,每个物品计算他们的0和1的数量,然后执行放和不放最多承载m个0和n个1背包的操作,区别不过这里有0,1两个维度而已。

m 和 n 和 元素最多的子集 是3个维度,用二维数组dp[i][j],意思是最多m个0和n个1的集合的最大元素个数是dp[i][j],然后套用01背包公式求出结果就行了。

递推公式

dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

由01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])得来,

zeroNum oneNum相当于之前的重量weight[i],dp[i][j]和dp[i - zeroNum][j - oneNum]的意思还是放入还是不放入的意思,不过由之前只有 j 的一个维度变成了 i 和 j 的两个维度,加1是相当于之前的价值value[i],因为每次遍历的是单个字符串,所以只能+1.

初始化

物品价值不会为负数,初始化为0

vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0));

遍历顺序

一维度的01背包都是后续遍历,这里虽然像两维度的,但却是两个相同维度的一维度,所以顺序先遍历那边都行,我是这样理解的。

总代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 默认初始化0for (string str : strs) { // 遍历每个物品,也就是每个字符串int oneNum = 0, zeroNum = 0;for (char c : str) {//遍历当前物品也就是当前的字符串的0和1数量if (c == '0') zeroNum++;else oneNum++;}//用上面得到当前字符串的0和1数量for (int i = m; i >= zeroNum; i--) { // 遍历背包容量且从后向前遍历!for (int j = n; j >= oneNum; j--) {dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}}//注意第一个for到这里才结束return dp[m][n];}
};

这题也蛮抽象的

http://www.zhongyajixie.com/news/22092.html

相关文章:

  • 做环境设计的网站semester什么意思
  • seo关键词排名优化制作seo公司品牌哪家好
  • 做窗帘的网站长春网络营销公司
  • 不良网站代码怎么查项目推广平台排行榜
  • 淄博政府网站建设公司哪家专业pc优化工具
  • win2003怎么做网站营销方式有哪几种
  • 网站后台是怎么操作的长春视频剪辑培训机构
  • 太原做彩票网站公司最新疫情最新数据
  • 济铁工程建设集团公司官方网站百度网站搜索排名
  • 做跨境的网站有哪些个人博客网站
  • 肇庆企业自助建站系统企业管理培训班
  • 可以做盗版漫画网站吗seo网站排名后退
  • 广州网站建设中心广告图片
  • 桥梁建设网站在哪里可以投稿产品软文代写
  • 企业网站黄页怎么做龙网网络推广软件
  • wordpress 获取当前文章的分类吉林网络seo
  • 国外免费网站贺贵江seo教程
  • 新城免费做网站惠州seo外包费用
  • ppt软件seo怎么做关键词排名
  • wordpress调用网站标题最好的网络营销软件
  • 邗江建设局网站资料下载点金推广优化公司
  • 呼市网站建设网络销售是做什么的
  • 青蛙网站建设友缘在线官网
  • 怎么做最火的视频网站网络营销的原理
  • 如何做微信小程序网站小红书推广怎么做
  • 公司建设网站申请报告范文如何进行搜索引擎优化 简答案
  • wordpress几个网站共用用户培训总结怎么写
  • 婚庆大气网站源码恩城seo的网站
  • 自适应网站制作方案搜狐财经峰会直播
  • 音乐网站制作课程报告自媒体怎么做