背包问题的模板及各个等价变形

news2024/9/25 11:22:06

目录

0-1背包 —— 二维二重循环

01背包 —— 一维二重循环

完全背包 —— 二维三重循环

完全背包 —— 二维二重循环

完全背包 —— 一维二重循环

0-1背包 —— 二维二重循环

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N][N];
int v[N], w[N];

int main() {
    int n, vm;
    cin >> n >> vm;

    for (int i = 1; i <= n; i++) {
        cin >> v[i] >> w[i];
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= vm; j++)
        {
            dp[i][j] = dp[i-1][j];
            if(v[i] <= j) dp[i][j] = max(dp[i][j], dp[i-1][j - v[i]] + w[i]);
            
        }
    }

    cout << dp[n][vm];

    return 0;
}

01背包 —— 一维二重循环

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N];
int v[N], w[N];

int main() {
    int n, vm;
    cin >> n >> vm;

    for (int i = 1; i <= n; i++) {
        cin >> v[i] >> w[i];
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = vm; j >= v[i]; j--)
        {
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
        }
    }

    cout << dp[vm];

    return 0;
}

完全背包 —— 二维三重循环

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N][N];
int v[N], w[N];

int main() {
    int n, vm;
    cin >> n >> vm;

    for (int i = 1; i <= n; i++) {
        cin >> v[i] >> w[i];
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= vm; j++)
        {
            for(int k = 0; k * v[i] <= j; k++) //从不选到多选
            {
                dp[i][j] = max(dp[i][j], dp[i-1][j - k*v[i]] + k*w[i]);
            }
        }
    }
    
    cout << dp[n][vm];

    return 0;
}

这个就是比选0,选1多了选的情况。

多选多少,由j是v[i]的多少倍决定。

下拉操作(就是选0)整合进了k = 0的情况。

为什么不是dp[i][j] = dp[i-1][j] ?

因为现在可能有多个值来更新dp[i][j],max函数只接受两个参数,于是不断更新dp[i][j]自身,而dp[i-1][j]代表的是选0,已经被整合进dp[i-1][j - k*v[i]] + k*w[i] 的众多分身了(k=0时的分身)

完全背包 —— 二维二重循环

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N][N];
int v[N], w[N];

int main() {
    int n, vm;
    cin >> n >> vm;

    for (int i = 1; i <= n; i++) {
        cin >> v[i] >> w[i];
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= vm; j++)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= v[i]) dp[i][j] = max(dp[i][j], dp[i][j-v[i]] + w[i]);
        }
    }
    
    cout << dp[n][vm];

    return 0;
}

把第一个蓝色等式两边进行替换,把j替换为j - v[i]。得到第二个蓝色等式,对第一个蓝色式子右边的局部进行替换得到红色等式。

完全背包 —— 一维二重循环

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N];
int v[N], w[N];

int main() {
    int n, vm;
    cin >> n >> vm;

    for (int i = 1; i <= n; i++) {
        cin >> v[i] >> w[i];
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = v[i]; j <= vm; j++)
        {
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
        }
    }
    
    cout << dp[vm];

    return 0;
}

类似0-1背包的降维操作。但是这里j参数下的值的求取不依赖于上层的更小的j参数下的值的求取,而是本层的,因此正常从小到大遍历即可。

下图示例

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

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

相关文章

Kali Linux 命令大全

一、引言 Kali Linux 作为一款专为渗透测试和安全研究设计的操作系统&#xff0c;拥有丰富的命令行工具&#xff0c;熟练掌握这些命令对于高效地进行安全测试和分析至关重要。本文将为您详细介绍 Kali Linux 中常用的命令&#xff0c;涵盖系统信息获取、文件操作、网络分析、用…

期权懂技巧分享:小细节决定成功的一切!

今天带你了解期权懂技巧分享&#xff1a;小细节决定成功的一切&#xff01;在期权交易市场中&#xff0c;有不少玩家胜率都只在50%左右&#xff0c;长期下来基本都是不赚不亏&#xff0c;甚至是有小额的亏损。 期权是一种金融衍生工具&#xff0c;它赋予持有人在未来某个时间以…

UWB定位系统常用的定位方法

UWB定位系统是一种无线定位技术&#xff0c;它使用超宽带无线电信号来确定移动设备的位置。与其他定位技术相比&#xff0c;UWB定位系统具有多种优势&#xff0c;例如高精度、低功耗、非视距定位能力和抗干扰能力强等。 UWB定位系统的工作原理是向移动设备发送一系列高频无线电…

如何在桌面同时展示多个窗口

一、实现2分屏显示 win箭头 二、实现3分屏显示 1. 在实现2分屏显示的基础上&#xff0c;再次点击箭头图标&#xff0c;这次选择屏幕的上方或下方。 2. 点击后&#xff0c;第三个窗口将会出现在你选择的区域。现在&#xff0c;你可以在三个窗口之间自由切换&#xff0c;提高工…

品牌渠道管控中的网络维权

在当今竞争激烈的市场环境中&#xff0c;品牌的渠道管控至关重要。其中&#xff0c;对渠道价格的有效管理是关键一环。然而&#xff0c;并非所有低价链接都能通过简单的沟通解决&#xff0c;这使得知识产权维权在渠道管控中成为不可或缺的手段。 那么&#xff0c;究竟什么是品牌…

细说防静电活动地板的分类

防静电地板是一种专门设计用于消除静电荷积累的地板。防静电地板的主要功能是通过将电荷导入大地&#xff0c;使得机房的防静电地板表面不再带有静电离子&#xff0c;从而防止静电对电子设备、人员等的干扰和潜在损害。防静电地板分为直铺防静电地板和架空防静电地板&#xff0…

【方正飞翔-注册/登录安全分析报告-验证结果保存到前端变量导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

网站建站有哪些方法

1. 传统网站建设 特点&#xff1a; 通过手动编写HTML、CSS和JavaScript等前端代码&#xff0c;结合后端开发语言&#xff08;如PHP、Java、.NET等&#xff09;和数据库技术&#xff08;如MySQL、Oracle等&#xff09;来构建网站。 灵活性和可定制性高&#xff0c;可以根据需…

资产负债率、净资产收益率怎么分析?教你弄懂财务报表的关键

财务报表中包含大量的信息&#xff0c;如果我们在解读财务报表时没有思路&#xff0c;不分重点&#xff0c;就很容易被繁杂的数据弄得头晕眼花。本文就财务报表中的关键指标、资产负债率解读、净资产收益率分析、计算销售复合增长率等几个方面进行介绍&#xff0c;大家可以根据…

防止网络环路,98%的网工都是这么操作的

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 我的网工朋友&#xff0c;大家好。 你肯定知道这个经典网络组网模型&#xff1a;接入-汇聚-核心-出口。 接入多数是二层交换机为主&#xff0c;…

Vue3 +Elementplus的学习 (用vite构建项目)

一、创建vite3项目: 1、在某个盘下面新建项目的文件夹,然后右键,在终端打开: 2、输入命令: npm init vite 3、输入项目名称: 4、选择框架vue: 5、选择JavaScript: 6、进入到项目文件夹:

瑞幸因《黑神话:悟空》被骂惨;雷军小米汽车正研究进入欧洲;Meta Quest 3 头显透视摄像头被「破解」| 网易数智日报

今日&#xff0c;网易数智日报来啦~~ 1.刚刚&#xff0c;瑞幸因《黑神话&#xff1a;悟空》被骂惨&#xff0c;A股却“牛”了&#xff01; “官方昨天在直播间明确表示门店一开门就能核销套餐&#xff0c;今天又改口9点之后才能买。”“明明吧台上一堆周边&#xff0c;但是买不…

高维数据检索:局部敏感哈希算法

文章目录 LSH 算法的原理工作原理LSH 模拟实现应用示例 LSH 的优缺点优点缺点实际案例 优化策略存在的挑战与局限性优化方向多哈希策略其他优化点 LSH 在大数据环境中的扩展性与适应性大数据环境下的挑战结合分布式系统的解决方案使用 Apache Spark 进行 LSH 结语 局部敏感哈希…

day24 Java面向对象——什么是面向对象

day24 Java面向对象——什么是面向对象 文章目录 day24 Java面向对象——什么是面向对象1. 什么是面向对象面向对象的核心概念面向对象的优点示例 1. 什么是面向对象 在Java中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一…

ardupilot开发 --- 故障保护 篇

不患贫而患不均&#xff0c;不患寡而患不安 RC 故障触发因素参数保护动作如何设置关于 SmartRTL、RTL 的返航高度 RC 故障 触发因素 遥控器关机 丢失连接、超出连接RC范围 遥控器油门值低于 FS_THR_VALUE. 遥控接收机(天空端)失去电源 遥控接收机与飞控的连接出现故障 等等…

跨云容灾原来还能这么便捷!

背景 大量组织正在将业务系统迁移到云&#xff0c;以利用其可扩展性。而云上的业务连续性保护依然重要&#xff0c;灾难&#xff0c;病毒&#xff0c;人为错误等仍然在威胁企业数据安全。 云平台被广泛采用作为各种规模企业的首选容灾平台&#xff0c;是 DRaaS 的重要市场驱动…

基于云快充协议1.5-1.6版本的充电桩系统软件-充电桩系统 -新能源车充电平台源码

介绍 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码 充电桩平台充电桩系统充电桩小程序充电桩管理系统充电桩项目充电桩协议充电桩微信小程序S…

收藏,Wireshark最好用的抓包命令都在这了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 在现在&#xff0c;网络流量的监控与分析变得尤为重要。 无论是排查网络故障、优化性能还是确保网络安全&…

笔记分享: 香港中文大学CSCI5610高级数据结构——最邻近查询

文章目录 Approximate Nearest Neighbor Search \textbf{Approximate Nearest Neighbor Search} Approximate Nearest Neighbor Search 1. Doubling Dimension \textbf{1. Doubling Dimension} 1. Doubling Dimension 1.0. Intro \textbf{1.0. Intro} 1.0. Intro 1.1. Doubling…

对于mp4 ios和mac safari不能播放问题处理

直接对原mp4文件进行重新转码就可以了 ffmpeg -i origin.mp4 -vcodec h264 -profile:v high -level 4.1 orgin_hl.mp4 原因源文件不符合苹果基本规则 苹果官网文档