关于01背包和完全背包问题的细节思考

news2024/11/29 4:40:30

01背包问题

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<cmath>
int main()
{
    int M=0;    //材料数
    int N=0;    //背包容量
    std::cin>>M>>N;
    std::vector<int>space(M,0);
    for(int i=0;i<M;i++) std::cin>>space[i];
    std::vector<int>value(M,0);
    for(int i=0;i<M;i++)std::cin>>value[i];

    std::vector<std::vector<int>>dp(M+1,std::vector<int>(N+1,0));
    //考虑物品1-i时,背包容量为j情况下,最大价值量
    //dp[i][j] = std::max(dp[i-1][j-weight[i]] + value[i],dp[i-1][j]);
    for(int i=1;i<=M;i++)
    {
        for(int j=1;j<=N;j++)
        {
            if(j>=space[i-1])
            dp[i][j] = std::max(dp[i-1][j-space[i-1]] + value[i-1],dp[i-1][j]);
            else 
            dp[i][j] = dp[i-1][j];
        }
    }
    std::cout<<dp[M][N];
    
}

二维数组处理01背包特点是:
背包和物品的遍历顺序可以调换。
背包容量从小到大更好理解。
如果采用一维数组进行滚动呢?

int main()
{
    int M=0;    //材料数
    int N=0;    //背包容量
    std::cin>>M>>N;
    std::vector<int>space(M,0);
    for(int i=0;i<M;i++) std::cin>>space[i];
    std::vector<int>value(M,0);
    for(int i=0;i<M;i++)std::cin>>value[i];
    std::vector<int>dp(N+1,0);
    // std::vector<std::vector<int>>dp(M+1,std::vector<int>(N+1,0));
    //考虑物品1-i时,背包容量为j情况下,最大价值量
    //dp[i][j] = std::max(dp[i-1][j-weight[i]] + value[i],dp[i-1][j]);
    for(int i=1;i<=M;i++)
    {
        for(int j=N;j>=1;j--)
        {
            if(j>=space[i-1])
            dp[j] = std::max(dp[j-space[i-1]] + value[i-1],dp[j]);
            else 
            dp[j] = dp[j];
        }
    }
    std::cout<<dp[N];
}

可以发现,这里最大的变化就是背包容量是从大到小遍历了。因为:数组的递推以来上一个物品和更小的重量。二维情况下是因为相关数据存储在了上一行,所以从小到大遍历。但是一维数组情况下,如果从小到大遍历将会覆盖上一个物品的数据。那么现在物品和背包容量的遍历顺序还可以调换吗?答案是不能!!!
滚动数组处理01背包特点是:
物品遍历在外,背包从大到小。

完全背包问题

如果一个物品可以添加无数次呢?应该怎么处理?
如果用二维数组解,那么内部还需要多一个对物品数量的for循环。
如果用滚动数组解呢?
这里直接给结论:物品、容量遍历顺序随意,但是容量需要从小到大遍历!
在这里插入图片描述

一般情况下,在手撕过程中不可能有时间推导这些,所以请记住两种背包的结论:
滚动数组01背包: 物品先容量后(必须), 容量从大到小(必须)
滚动数组完全背包:物品先容量后(非必须),容量从小到大(必须)

完全背包的排列组合问题

虽然一般情况下,完全背包的容量问题可以不考虑遍历顺序,但是如果是排列组合问题,就需要考虑遍历顺序了!
结论:
如果求组合,那么物品遍历在外(可以理解为物品加入的顺序是定的)
如果求排列,那么物品遍历在内(可以理解为物品多次循环,因此物品顺序不定)
代码随想录相关练习在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nodejs 第六十二章(短链接)

短链接介绍 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。它通常由一系列的字母、数字和特殊字符组成&#xff0c;比起原始的长网址&#xff0c;短链接更加简洁、易于记忆和分享。 短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些…

Offline RL : Efficient Planning in a Compact Latent Action Space

ICLR 2023 paper Intro 采用Transformer架构的Planning方法对马尔可夫序列重构,(et. TT)在面对高维状态动作空间&#xff0c;容易面对计算复杂度高的问题。本文提出TAP算法&#xff0c;基于Transformer的VQ-VAE&#xff0c;利用提取的状态动作在隐空间的低微特征进行Planning…

表单,表格小练习

表格练习&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

创新指南|战略衡量的增长组织:用人工智能增强关键绩效指标(KPI)

传统的关键绩效指标 (KPI)越来越无法提供领导者取得成功所需的信息和见解。他们在跟踪进展、协调人员和流程、确定资源优先级以及推进问责制方面存在不足。本文是 2024 年第一份麻省理工学院 SMR - BCG 人工智能和商业战略全球高管学习和研究项目的调查结果——人工智能和业务战…

成为 Jira 大师:效率达人的必备秘诀

&#x1f525; 效率达人喜欢使用 Jira 的快捷键和命令面板&#xff0c;因为他们能够在不移动鼠标的情况下&#xff0c;快速执行各种命令和导航操作&#xff0c;从而更有效地完成 Jira 中的常见任务。 &#x1f3d6;️ 通过熟练掌握这些快捷键和命令&#xff0c;效率达人能够更…

Python+Selenium+Unittest 之Unittest5(常用装饰器-跳过用例执行)

目录 1、unittest.skip()&#xff08;跳过该装饰器下的用例&#xff09; 2、unittest.skipIf()&#xff08;跳过该装饰器下判断条件为True的用例&#xff09; 3、unittest.skipUnless()&#xff08;跳过该装饰器下判断条件为False的用例&#xff09; 4、unittest.expectedF…

qt进阶2:windows下可执行程序崩溃生成dmp,定位崩溃问题。

系列文章目录 文章目录 系列文章目录前言一、dmp文件生成二、使用步骤1.代码案例2.运行截图 前言 qt编译的可执行程序在windows下崩溃可生成dmp文件&#xff0c;用于调试定位崩溃原因。 一、dmp文件生成 略 二、使用步骤 1.代码案例 代码如下&#xff08;示例&#xff09;&…

PCB封装库的创建及引入

法1 1.创建lib 2.放置 找到你想要画的封装的器件的数据手册了解相关信息。 直插式选Multi-layer 贴片选Top-layer 焊盘尺寸 焊盘空尺寸 法2 嘉立创eda直接copy 再嘉立创中找到你想要的pcb&#xff0c;导出为ad 然后再ad中找到我们导出的文件 复制他 然后再库中粘贴 pcb库…

十进制,二进制,八进制,十六进制之间转换

一. 十进制转二进制 二. 二进制转十进制 三. 十进制转八进制 四. 八进制转十进制 五. 十进制转十六进制

Java代码基础算法练习-统计学生成绩-2024.04.11

任务描述&#xff1a; 编写程序&#xff0c;输入n个(0<n<50)学生的成绩(输入-1结束)&#xff0c;要求统计并输出优秀(大任务描述:于85)、及格(60~84)和不及格(小于60)的学生人数。(成绩取值范围0~100) 任务要求&#xff1a; 代码示例&#xff1a; /*** 这个程序用于统计…

编程技巧(五) mysql中查询将行转为列逗号隔开拼接

让清单成为一种习惯 互联网时代的变革,不再是简单的开发部署上线,持续,正确,安全地把事情做好尤其重要;把事情做好的前提是做一个可量化可执行的清单,让工程师就可以操作的清单而不是专家才能操作: 设定检查点 根据节点执行检查程序操作确认或边读边做 二者选其一不要太…

近屿OJAC带你解读:什么是大模型幻觉?

概念介绍 大模型幻觉指的是大型语言模型&#xff08;LLM&#xff09;在生成内容时出现的与现实世界事实或用户输入不一致的现象&#xff0c;这种现象可以被视为模型的“胡说八道”。具体来说&#xff0c;大模型的幻觉可以分为事实性幻觉和忠实性幻觉。 事实性幻觉&#xff0c…

[StartingPoint][Tier2]Vaccine

Task 1 Besides SSH and HTTP, what other service is hosted on this box? (除了SSH和HTTP&#xff0c;这个盒子上还托管了什么其他服务) # nmap -sS -T4 10.129.230.43 --min-rate 1000 ftp Task 2 This service can be configured to allow login with any password fo…

Pycharm远程连接服务器配置详解

背景&#xff1a; 相信很多人都遇到了这种情况&#xff0c;日常的开发和程序的验证都需要在linux环境下验证&#xff0c;而我们都是使用本地windows来进行开发或者脚本的编写&#xff0c;然后再push到远程仓库&#xff0c;再到linux环境下pull下来代码验证&#xff0c;这样每次…

【2024】使用Rancher管理k8s集群和创建k8s集群

Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

蓝桥杯-【二分】肖恩的苹果林

思路:有点类似于找最大值的最小化。 代码及解析 常规的模板引用40% #include <bits/stdc.h> using namespace std; #define ll long long const ll N1e53; ll a[N]; ll m,n; ll chack(ll mid) {int res1,last0;for(int i1;i<n;i){ if(a[i]-a[last]>mid){res;las…

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…

亚马逊云的账单申诉

亚马逊云科技申诉通常涉及几个步骤&#xff0c;目的是解决账单错误或申请费用调整。以下是一个基本的指南&#xff0c;可以帮助你开始处理账单问题&#xff1a; 1. 审核账单 在开始申诉之前&#xff0c;首先登录到亚马逊云科技管理控制台。 导航到“账单仪表板”以查看当前的…

如何在Python中进行指数和对数曲线拟合?

在本文中&#xff0c;我们将学习如何在Python中进行指数和对数曲线拟合。首先我们要问的问题是什么是曲线拟合&#xff1f; 曲线拟合是构造曲线或数学函数的过程&#xff0c;其具有对一系列数据点的最佳拟合&#xff0c;可能受到约束。 对数曲线拟合&#xff1a;对数曲线是对…