代码随想录算法训练营第三十六天 | 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

news/2024/9/18 23:21:44 标签: 算法

第三十六天打卡,今天的题还是比较抽象,特别是后面两题,他们是01背包问题,只是递推公式变了,这点不容易想到


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

题目链接

解题过程

  • dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。求得dp.back()即为值最接近target的重量
  • targetsum / 2,即要求容量为target的背包中,最多装重量为多少的石头。
  • 在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp.back() 一定是大于等于dp[target]

01背包

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        int target = 0;
        for (int n : stones) sum += n;
        target = sum / 2;
        vector<int>dp(target + 1);
        for (int i = 0; i < stones.size(); i++) {
            for (int j = target; j >= 0; j--) {
                if (j >= stones[i]) {
                    dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
                }
            }
        }
        return sum - 2 * dp.back();
    }
};

494.目标和

题目链接

解题过程

  • 没想到用背包问题能解决和的方案个数问题
  • 不放物品i:即背包容量为j,里面不放物品i,装满有dp[i - 1][j]中方法。
  • 放物品i: 即:先空出物品i的容量,背包容量为(j - 物品i容量),放满背包有 dp[i - 1][j - 物品i容量] 种方法。
  • 抽象成一维dp[j] += dp[j - nums[i]]

01背包

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

474.一和零

题目链接

解题过程

  • 还是挺难想到的,本题为01背包问题
  • dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]
  • dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

01背包

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>>dp(m + 1, vector<int>(n + 1)); //m个0和n个1最多的子集长度
        for (string str : strs) {
            int oneNum = 0;
            int 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.back().back();
    }
};

http://www.niftyadmin.cn/n/5664689.html

相关文章

MySQL连接相关知识点

MySQL连接相关知识点 1. 查看当前连接 看当前 MySQL 的连接数和相关信息&#xff1a; SHOW STATUS LIKE Threads_connected;查看详细的连接信息&#xff0c;包括每个会话的状态&#xff0c;可以使用以下命令&#xff1a; SHOW PROCESSLIST;查看所有连接&#xff0c;包括没有…

java重点学习-JVM调优实践

12.15 JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置 修改TOMCAT HOME/bin/catalina.sh文件jar包部署在启动参数设置 java -Xms512m -Xmx1024m -jar xxxx,jar 12.16 JVM 调优的参数有哪些 对于IM调优&#xff0c;主要就是调整年轻代、老年代、元空间的内存空间大…

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接&#xff1a; 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…

Python爬虫案例七:抓取南京公交信息数据并将其保存成excel多表形式

测试链接: https://nanjing.8684.cn/line4 思路&#xff1a;先抓取某个类型下的某一条线路所有数据&#xff0c;然后实现批量,&#xff0c;列举出三个类型代表既可 源码&#xff1a; from lxml import etree from xlutils.copy import copy import requests, os, xlrd, xlwtd…

在Ubuntu中编译含有JSON的文件出现报错

在ubuntu中进行JSON相关学习的时候&#xff0c;我发现了一些小问题&#xff0c;决定与大家进行分享&#xff0c;减少踩坑时候出现不必要的时间耗费 截取部分含有JSON部分的代码进行展示 char *str "{ \"title\":\"JSON Example\", \"author\&…

QGis二次开发 —— 3、程序加载栅格tif与矢量shp文件可进行切换控制,可进行导出/导入工程(附源码)

效果 功能说明 软件可同时加载.tif栅格图片与.shp矢量图片、加载图片后可进行自由切换查看图层、可对加载的图片进行关闭 关闭后清空图层、可对加载的图片进行导出.qgs的QGIS工程、可对.qgs的QGis工程导入并导入后可进行自由切换查看图层。 源码 注意: 在加载tif栅格文件后会在…

基于SpringBoot+Vue的房屋租赁平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Mobile net V系列详解 理论+实战(2)

Mobilenet 系列 实践部分一、数据集介绍二、模型整体框架三、模型代码详解四、总结 实践部分 本章针对实践通过使用pytorch一个实例对这部分内容进行吸收分析。本章节采用的源代码在这里感兴趣的读者可以自行下载操作。 一、数据集介绍 可以看到数据集本身被存放在了三个文件…