代码随想录刷题第41天

首先是01背包的基础理论,背包问题,即如何在有限数量的货物中选取使具有一定容量的背包中所装货物价值最大。使用动规五步曲进行分析,使用二维数组do[i][j]表示下标从0到i货物装在容量为j背包中的最大价值,dp[i][j]可由不放物品i(dp[i -1][j])与放置物品i(dp[i - 1][j - weight[i]])两个方向确定,可得递推公式为dp[i][j] = max(dp[i -1][j], dp[i - 1][j - weight[i]])。再对dp数组进行初始化,j为0时,背包里无法装入任何物品,最大价值dp[i][0] = 0,i为0时,在0号物品中进行选取,当j < weight[0]时,背包无法放入物品0,dp[0][j]=0,当j>=weight[0]时,背包里可以放入物品0,dp[0][j] = value[0]。dp数组其他位置初始化为0即可,因为这些位置的值是由dp[i - 1][j]与dp[i - 1][j - weight[i]]决定的。遍历顺序为先遍历物品,再遍历背包。

#include <bits/stdc++.h>
using namespace std;
int n, bagweight;
void solve() {
    vector<int> weight(n, 0);
    vector<int> value(n, 0);
    for (int i = 0; i < n; ++i){
        cin >> weight[i];
    }
    for (int j = 0; j < n; ++j){
        cin >> value[j];
    }
    vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
    for (int j = weight[0]; j <= bagweight; j++){
        dp[0][j] = value[0];
    }
    for (int i = 1; i < weight.size(); i++){
        for (int j = 0; j <= bagweight; j++){
            if (j < weight[i]) dp[i][j] = dp[i - 1][j];
            else dp[i][j] = max(dp[i - 1][j - weight[i]] + value[i],
            dp[i - 1][j]);
        }
    }
    std::cout << dp[weight.size() - 1][bagweight] << std::endl;
    
}
int main() {
    while(cin>> n >> bagweight){
        solve();
    }
    return 0;
}

第二题是将01背包中的二维dp数组压缩为一维数组,将i-1层数据拷贝到当前层,将dp[j]压缩为dp[j]:容量为j的背包可以容纳物品的最大价值。dp[j] = max(dp[j], dp[j - weight[i]] + value[i]),由于dp[j]需要在自身与去掉物品i之间相比较,所以dp数组直接初始化为0即可。与二维dp数组不同的是,一维数组的背包遍历需要从后向前遍历,防止同一物品被多次取到。

#include <iostream>
#include <vector>
using namespace std;
int main(){
    int m, n;
    cin >> m >> n;
    vector<int> costs(m);
    vector<int> values(m);
    for (int i = 0; i < m; i++){
        cin >> costs[i];
    }
    for (int j = 0; j < m; j++){
        cin >> values[j];
    }
    vector<int> dp(n + 1, 0);
    for (int i = 0; i < m; i++){
        for (int j = n; j >= costs[i]; j--){
            dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);
        }
    }
    std::cout << dp[n] << std::endl;
    return 0;
}

明显看到,一维dp数组的代码要比二维的简洁许多。

第三题是01背包的应用问题分割等和子集https://leetcode.cn/problems/partition-equal-subset-sum/description/,关于这道题为何能用01背包解决,卡哥在代码随想录中做出了如下解释:利用动规五步曲进行分析可得:当dp[sum/2] = sum/2时,即可找到满足题意的集合。dp[j] = max(dp[j],dp[j - nums[i]] + nums[i])。遍历方式与初始化均与01背包相同。

class Solution {
public:
    bool canPartition(vector<int>& nums) {
    int sum = 0;
    for (int i = 0; i < nums.size(); i++){
        sum += nums[i];
    }
    if (sum % 2 == 1) return false;
    int target = sum/2;
    vector<int> dp(10001, 0);
    for (int i = 0; i < nums.size(); i++){
        for (int j = target; j >= nums[i]; j--){
            dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
        }
    }
    if (dp[target] == target) return true;
    return false;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物理备份的方式

完全备份恢复流程 停止数据库清理环境重演回滚&#xff0d;&#xff0d;> 恢复数据修改权限启动数据库 1.关闭数据库&#xff1a; [rootmysql-server ~]# systemctl stop mysqld [rootmysql-server ~]# rm -rf /var/lib/mysql/* //删除所有数据// [rootmysql-server ~]# …

Sora:颠覆性AI视频生成工具

Sora是一款基于人工智能&#xff08;AI&#xff09;技术的视频生成工具&#xff0c;它彻底改变了传统视频制作的模式&#xff0c;为创作者提供了高效、便捷、高质量的视频内容生成方式。通过深度学习和自然语言处理等先进技术&#xff0c;Sora实现了从文字描述到视频画面的自动…

并发编程(5)共享模型之不可变

7 共享模型之不可变 本章内容 不可变类的使用不可变类设计无状态类设计 7.1 日期转换的问题 问题提出 下面的代码在运行时&#xff0c;由于 SimpleDateFormat 不是线程安全的, 有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果&#xff0c;…

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本&#xff0c;同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下&#xff1a; 父项目的pom.xm…

(拦截器)学习SpringMVC的第三天

一 .拦截器简介 拦截器的几个处理阶段 二 . 拦截器快速入门 2.1 实现拦截器接口 public class MyInterceptor1 implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Excep…

微信小程序开启横屏调试

我们先打开小程序项目 开启真机运行 目前是一个竖屏的 然后打开全局配置文件 app.json 给下面的 window 对象 下面加一个 pageOrientation 属性 值为 landscape 运行结果如下 然后 我们开启真机运行 此时 就变成了个横屏的效果

(done) Positive Semidefinite Matrices 什么是半正定矩阵?如何证明一个矩阵是半正定矩阵? 可以使用特征值

参考视频&#xff1a;https://www.bilibili.com/video/BV1Vg41197ew/?vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料(半正定矩阵的定义)&#xff1a;https://baike.baidu.com/item/%E5%8D%8A%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/2152711?frge_ala 看看半正定矩阵的…

ubantu设置mysql开机启动

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在Ubuntu系统中设置MySQL开机启动&#xff0c;通常有以下几种方法&#xff1a; 1. **使用systemctl命令**&#xff1a; Ubuntu 16.04及更高版本使用systemd作为…

Facebook群控:利用代理IP克服多账号关联

拥有多个 Facebook 帐户对于区分您的个人和企业在线形象或维护客户页面非常有用。然而&#xff0c;Facebook 的服务条款正式限制用户只能使用一个个人帐户&#xff0c;想要多账号运营&#xff0c;下面的干货必须看&#xff01; 一、Facebook群控是什么&#xff1f; Facebook群…

HDL FPGA 学习 - FPGA基本要素,开发流程,Verilog语法和规范、编写技巧

目录 Altera FPGA 基本要素 FPGA 开发流程和适用范围 设计和实施规范 顶层设计的要点 Verilog HDL 语法规范 编写规范 设计技巧 编辑整理 by Staok&#xff0c;始于 2021.2 且无终稿。转载请注明作者及出处。整理不易&#xff0c;请多支持。 本文件是“瞰百易”计划的…

线程计数器(CountDownLatch)

&#x1f96d;线程计数器&#xff08;CountDownLatch&#xff09; CountDownLatch也属于共享锁&#xff0c;其内部有一个int类型的属性表示可以同时并发并行的线程的数量 同时等待N个任务执行结束 举例说明&#xff1a; 比如跑步比赛&#xff0c;必须等所有运动员通过终点才…

Oracle EBS GL 外币折算逻辑

背景 由于公司财务在10月份期间某汇率维护错误,导致帐套折算以后并合传送至合并帐套生成合并日记帐凭证的借贷金额特别大,但是财务核对的科目余额有没有问题,始终觉得合并日记帐生成会计分发有问题,需要我们给出外币折算逻辑。 基础设置 汇率 Path: GL->设置->币种-&…

PHP语言检测用户输入密码及调用Python脚本

现在有一份计算流体力学N-S方程的Python脚本&#xff0c;想要在用户登录网站后可以可以运行该脚本&#xff0c;然后将脚本运行后绘制的图片显示在用户网页上。 建一个名为N_S.py的python脚本文件&#xff0c;这个脚本在生成图像后会自行关闭&#xff0c;随后将图片保存在指定的…

Stable Diffusion 3重磅发布

刚不久&#xff0c;Stability AI发布了Stable Diffusion 3.0&#xff0c;这一版本采用了与备受瞩目的爆火Sora相同的DiT架构。通过这一更新&#xff0c;画面质量、文字渲染以及对复杂对象的理解能力都得到了显著提升。由于这些改进&#xff0c;先前的技术Midjourney和DALL-E 3在…

解决vulhub漏洞环境下载慢卡死问题即解决docker-valhub漏洞环境下载慢的问题

解决vulhub环境下载慢/卡 当前环境为&#xff1a;ubuntu20 1.在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json编辑daemon.json文件 sudo vim daemon.json2.填写阿里云镜像地址&#xff1a; { "registry-mirrors":["https://6kx…

SWIFT:自我认知微调

文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E6%88%91%E8%AE%A4%E7%9F%A5%E5%BE%AE%E8%B0%83%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md ​​​​​​代码: Swift是如何把自我认知数据集融合到训练集中呢? 1:相关的3个参数

Java8 Stream API 详解:流式编程进行数据处理

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Vue3中的select 的option是多余的?

背景&#xff1a; 通过Vue3中填充一个下拉框&#xff0c;在打开页面时要指定默认选中&#xff0c;并在选项改变时把下拉框的选中值显示出来 问题&#xff1a; 填充通常的作法是设置 <option v-for"option in cities" :value"option.value" >&a…

【数据结构-字符串 五】【字符串转换】字符串转为整数

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串转换】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

C++ 离散化算法设计原则:压缩的都是精华

公众号&#xff1a;编程驿站 1. 离散化 离散化是离散数学中的概念。离散化算法&#xff0c;指把无限空间中的离散数据映射到一个有限的存储空间中&#xff0c;并且对原数据进行有序索引化。主打压缩的都是精化。 离散化流程&#xff1a; 对离散化数列{235,897,458,7654,458…