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

day-42 代码随想录算法训练营 动态规划 part 04

416.分割等和子集

分析:需要总和能分成两半,并且有子集能装满一半
思路:
  • 1.dp存储:容量为j时装入的最大数值和dp[j]
  • 2.dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])  
  • 3.全部初始化为0
  • 4.遍历顺序:外层遍历元素,内层遍历重量

2:   dp[j]就是上一轮,还没有遍历到当前nums[i]时的最大和,所以相当于不装nums[j]

        dp[j-nums[i]],为啥要 j-nums[i] 的容量呢,因为要满足容量为 j ,所以装之前要找到 容量为 j-nums[i] 装入的最大和,然后装入当前 nums[i] ,总容量才为 j (要是直接dp[j]+nums[i],就会导致容量超过 j 。

1049.最后一块石头的重量 ||

分析:石头相撞,剩余多出的部分,相当于能分成的最近似的两堆石头
思路:
  • 1.dp存储:先将stones总和求出,求出一半,dp存储的是容量为 j 装的最大重量
  • 2.dp[j]=max(dp[j],dp[j-stones[i]]-stones[i]);
  • 3.初始化:全部初始化为0
  • 4.遍历顺序:外层遍历石头,内层遍历容量
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int total=0;for(auto it:stones) total+=it;int target=total/2;vector<int>dp(total+1,0);for(int i=0;i<stones.size();i++){for(int j=target;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}return total-dp[target]*2;//装入的最大重量跟剩下的相抵消,剩余的就是最后一块石头}
};

494.目标和(一刷坐牢)

分析:正数总和-负数总和=目标和 -> 正数总和=(目标和+总和)/2
思路:
  • 1.dp存储:当和(容量)为 j 时,有dp [ j ] 中装法 。
  • 2.dp[ j ] =dp [ j - nums [ i ] ] ;
  • 3.初始化:dp [ 0 ] =1 ;
  • 4.遍历顺序:外层遍历数组,内层遍历容量
class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int it:nums) sum+=it;if(abs(target)>sum) return 0;//当总和小于目标和的绝对值时,不可能有情况(因为target被抵消过)//add表示正数的总和,sub表示负数的总和//add-(sum-add)=target//add=(target+sum)/2if((target+sum)%2==1) return 0;int bagSize=(target+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];}
};

474.一和零(坐牢)

分析:这一题还是背包,不同是有物品有两个维度: 0 和 1
思路:
  • 1.dp存储:当 0 容量为 i ,1 容量为 j 时,最多能装dp [ i ][ j ] 个字符串
  • 2.dp [ j ]:dp [ i ] [ j ] =max( dp [ i ] [ j ] , dp [ i - zeroNum ][ j - oneNum ] + 1 ] 
  • 3.初始化:全部初始化为0
  • 4.遍历顺序:外层遍历字符串数组,内层进行两个循环遍历
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>>dp(m+1,vector<int>(n+1,0));for(string str:strs){int oneNum=0,zeroNum=0;for(char c:str){if(c=='0') zeroNum++;else oneNum++;}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);}}}return dp[m][n];}
};

http://www.lryc.cn/news/155159.html

相关文章:

  • Swift 周报 第三十六期
  • 手写Mybatis:第19章-二级缓存
  • Alibaba Canal 使用记录
  • GIT实战篇,教你如何使用GIT可视化工具
  • lv3 嵌入式开发-4 linux shell命令(文件搜索、文件处理、压缩)
  • SpringBoot2.0集成WebSocket,多客户端
  • 华为OD机试 - 等和子数组最小和 - 深度优先搜索(Java 2022 Q4 100分)
  • 浏览器会因为什么样的脚本而崩溃
  • 生成与调用C++动态链接库(so文件)
  • 韶音的耳机怎么样,韶音骨传导耳机值得入手吗
  • STM32G030F6 (SOP-20)Cortex ® -M0+, 32KB Flash, 8KB RAM, 17 GPIOs
  • 常用的字符集和字符编码
  • 容器技术简介
  • 数据分享|R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据...
  • macos 不支持svn安装
  • 如何通过实际操作来加深对Linux命令和概念的理解?
  • 【开发语言】C语言与Python的互操作详解
  • 华为配置聚合vlan(Super vlan--Sub vlan)
  • CentOS7安装时直接跳过了安装信息摘要页面的解决方法
  • python基础运用例子
  • k8s基本概念
  • Python exp() 函数
  • Day 34 贪心算法 part03 : 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
  • 气象站的构成及功能应用
  • Qt中布局管理使用总结
  • (位运算) 剑指 Offer 15. 二进制中1的个数 ——【Leetcode每日一题】
  • 基于SSM的新能源汽车在线租赁系统
  • CTF 代码审计之绕过过滤的空白字符
  • 【Vue】 Vue3 安装说明,适合小白新手
  • 电脑提示“系统找不到指定的文件”怎么办?