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

湘潭网站公司浦东网站备案流程

湘潭网站公司,浦东网站备案流程,宁波seo推荐,长春市做网站的公司目录题目分析回溯法动态规划动态规划(压缩)题目来源 416. 分割等和子集 题目分析 这道题目是要找是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 那么只要找到集合里能够出现 sum / 2 的子集总和,就算是可以分割成两个相同元素和子集了…

目录

    • 题目分析
    • 回溯法
    • 动态规划
    • 动态规划(压缩)

题目来源
416. 分割等和子集

题目分析

这道题目是要找是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
那么只要找到集合里能够出现 sum / 2 的子集总和,就算是可以分割成两个相同元素和子集了。

回溯法

这道题和39. 组合总和非常类似(可以去做一下)
LeetCode-39. 组合总和

class Solution {boolean res;public boolean canPartition(int[] nums) {int sum = 0;for(int i = 0;i<nums.length;i++){sum += nums[i];}//如果为奇数,肯定就没有两个相等的子集了if(sum % 2 == 1){return false;}//查找目标target的子集和int target = sum / 2;backTracking(nums,0,0,target);return res;}//startIndex为了数组不选取重复元素,sum为加起来的总和,target目标数private void backTracking(int[] nums,int startIndex,int sum,int target){//如果sum>target就没必要进行计算了if(sum > target){return;}//如果等于,直接将res设置为为true,相当于是相同子集了if(sum == target){res = true;return;}for(int i = startIndex;i<nums.length;i++){sum+=nums[i];backTracking(nums,i+1,sum,target);sum-=nums[i];  //回溯}}
}

这道题使用回溯算法不行(超时),那么就要用动态规划了
在这里插入图片描述

动态规划

背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。
要注意题目描述中商品是不是可以重复放入。
即一个商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,写法还是不一样的。
要明确本题中我们要使用的是01背包,因为元素我们只能用一次。
回归主题:首先,本题要求集合里能否出现总和为 sum / 2 的子集。
那么来一一对应一下本题,看看背包问题如何来解决。
只有确定了如下四点,才能把01背包问题套到本题上来。

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

理解了0-1背包问题,直接搬照着公式就可以写出
https://donglin.blog.csdn.net/article/details/129412502

class Solution {public boolean canPartition(int[] nums) {if(nums == null){return false;}int sum = 0;for(int num : nums){sum += num;}if(sum % 2 == 1){return false;}int target = sum / 2;int[][] dp = new int[nums.length][target+1];for(int j=target;j>=nums[0];j--){dp[0][j] = nums[0];}for(int i = 1;i<nums.length;i++){for(int j = 1;j<=target;j++){if(j<nums[i]){dp[i][j] = dp[i-1][j];}else{dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i]);}}}return dp[nums.length-1][target]==target;}
}

在这里插入图片描述

动态规划(压缩)

动规五部曲分析如下:

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

01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。
本题中每一个元素的数值既是重量,也是价值。
套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]。
那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。

  • 2.确定递推公式

如果不清楚0-1背包问题的一维数组,可以看这篇
https://donglin.blog.csdn.net/article/details/129437136
01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
相当于背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。
所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);

  • 3.dp数组如何初始化

在01背包,一维dp如何初始化,已经讲过,
从dp[j]的定义来看,首先dp[0]一定是0。

  • 4.确定遍历顺序

如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!

        for(int i = 0;i<nums.length;i++){for(int j = target;j>=nums[i];j--){dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}
  • 5.举例推导dp数组

在这里插入图片描述

完整代码

class Solution {public boolean canPartition(int[] nums) {if(nums == null){return false;}int sum = 0;for(int num : nums){sum += num;}if(sum % 2 == 1){return false;}int target = sum / 2;int[] dp = new int[target+1];for(int i = 0;i<nums.length;i++){for(int j = target;j>=nums[i];j--){//物品 i 的重量是 nums[i],其价值也是 nums[i]dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}return dp[target] == target;}
}

在这里插入图片描述

http://www.yayakq.cn/news/794630/

相关文章:

  • 虚拟主机上的网站上传方式郑州网站建设模板制作
  • 辽宁建设网站首页东莞房价将暴跌
  • 符合seo的网站中文域名网站怎么发布信息
  • 优秀茶叶网站设计手机微信怎么建立公众号
  • 哪些企业用wordpress建站最佳网站制作模板
  • 成都专业网站设计免费咨询荥阳网站制作
  • 门户网站维护方案菜单宣传网站怎么做的
  • 网站建设公司专业网站开发需求网站seo哪家做的好
  • 国际网站平台创意设计绘画
  • 网站免费php模板网页塔防游戏排行榜
  • 医院网站建设需要注意什么制作团体网站
  • 网站建设五年发展规划学校门户网站作用
  • 潍坊网站建设 选聚搜网络藁城网络推广
  • 本地东莞网站建设wordpress调用错误模板的原因
  • 河北住房与城乡建设部网站长沙自动seo
  • 郑州模板建站平台公司网站是别人做的如何换logo
  • 百度不收录哪些网站洞口网站开发公司推荐
  • 品牌网站建设找顺的小程序开发定制平台
  • 网站的站点地图设计企业网站管理系统用哪个好
  • 超大免费网站空间怎么做网站设计
  • wordpress仿京东seo培训中心
  • 如何做好网站推万网主机怎么做网站
  • 南通网站建设计划书备份文件wordpress
  • 企业网站开发服务合同咸阳 网站建设
  • 网站建设对企业的重要性wordpress备份用户
  • 赢卡购网站建设为何网站打开慢
  • 贵州省都匀市网站建设网站功能模块有哪些
  • 东营市做网站东莞手机端网络推广
  • 绵阳网站推广排名深圳 网站制作
  • 移动网站开发内容大兴建站推广