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

代码随想录算法训练营第三十六天 | 动态规划 part04

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

思路是尽量找到相加和接近于石头总和一半,之后相碰剩下的才会是最小。

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = accumulate(stones.begin(), stones.end(), 0);int target = sum / 2;vector<int> dp(target + 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 sum - dp[target] * 2;}
};

494.目标和

这一题和最后一块石头的重量、分割等和子集一样,都是要分成两个集合,在这里,一个集合是给+,一个集合给-。
另外两题都是尽可能将两个集合的和差不多。
本题的关键是求解递推函数。假设left是给+符号,right是给-符号,left+right=sum,left - right = target.由上面两个式子可以得出left=(target+sum)/2.
那么怎么求得有多少种情况呢?本题就是给我们一个背包的容量(target+sum)/2,问有到少种方法可以把它装满。
分割等和子集可以把问题抽象为给我们一个背包,问能不能装满背包。
最后一块石头的重量是,能装多满。
有多少种方法可以装满背包的递推公式是dp[j]+=dp[j-nums[i]]

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = accumulate(nums.begin(), nums.end(), 0);int left;if ((sum + target) % 2 == 0)left = (sum + target) / 2;elsereturn 0;if (abs(target) > sum)return 0;vector<int> dp(left + 1, 0);dp[0] = 1;for (int i = 0; i < nums.size(); ++i) {for (int j = left; j >= nums[i]; --j) {dp[j] += dp[j - nums[i]];}}return dp[left];}
};

474.一和零

本题的物品属性是二维的,背包容量也是二维的,二维容量下最多能装多少个物品,所以每个物品价值都是1。

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {// 1. dp[i][j]定义: i个0,j个1的背包最多能装多少个物品// 2. 递推函数:dp[i][j] = max(dp[i][j], dp[i-x][j-y]+1)// 3. 初始化为0// 4. 遍历顺序和所有01背包一样vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (const string& str : strs) {int x = 0, y = 0;for (char c : str) {if (c == '0') x++;else y++;}for (int i = m; i >= x; --i) {for (int j = n; j >= y; --j) {dp[i][j] = max(dp[i][j], dp[i-x][j-y]+1);}}}return dp[m][n];}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 海外社媒账号如何让防关联?账号隔离的5大要点
  • 【web安全】权限漏洞之未授权访问
  • MacOS打开应用后反复提示“XXX将对你的电脑造成伤害。你应该将它移到废纸篓”的解决办法
  • 提取当前文件夹及其子文件夹中所有 .txt 文件的路径和文件名
  • 嵌入式学习day12(LinuxC高级)
  • Vue+Elementui el-table组件二次封装
  • 计算机算法基础:理论与实战
  • 算法——动态规划:基础
  • 基于Android aosp系统的云手机chromium浏览器定制
  • 翻译: 可视化深度学习反向传播原理二
  • CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮
  • 前端使用docx-preview展示docx + 后端doc转docx
  • HexView 刷写文件脚本处理工具-基本功能介绍(六)-导出MIME/BIN/FIAT/FORD
  • Android摄像头采集选Camera1还是Camera2?
  • 面试题:Java 集合类的遍历方式,如何一边遍历 一边删除?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CEF与代理
  • css系列之关于字体的事
  • Javascript弹出层-初探
  • Java教程_软件开发基础
  • MaxCompute访问TableStore(OTS) 数据
  • PermissionScope Swift4 兼容问题
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spark RDD学习: aggregate函数
  • Vue2.0 实现互斥
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 聊聊redis的数据结构的应用
  • 如何利用MongoDB打造TOP榜小程序
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用putty远程连接linux
  • 2017年360最后一道编程题
  • AI算硅基生命吗,为什么?
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #define、const、typedef的差别
  • #stm32整理(一)flash读写
  • #数据结构 笔记三
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (第二周)效能测试
  • (六)vue-router+UI组件库
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (循环依赖问题)学习spring的第九天
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)程序员技术练级攻略
  • .libPaths()设置包加载目录
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Framework 3.5安装教程
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net2005怎么读string形的xml,不是xml文件。
  • .netcore 获取appsettings