C++基础:二维费用的背包问题

news2024/11/16 5:47:10

注意:如果你还没搞定(指的是真正理解)01背包,请不要看。看了脑壳更晕

什么是二维费用的背包问题?请看AcWing上的一道题:

有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。

每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。

输入格式

第一行三个整数,N,V,M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。

接下来有 N 行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i 件物品的体积、重量和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N≤10000
0<V,M≤1000
0<vi,mi≤1000
0<wi≤10000

输入样例

4 5 6
1 2 3
2 4 4
3 4 5
4 5 6

输出样例:

8

这就是典型的二维费用背包问题。

首先考虑01背包转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]),这只有一个费用

那我们如何表示两个费用?

一种思路保存原有的状态(dp[i][j])、方程,选取一个费用优先满足条件,并求出此时的价值,再看另一个费用是否满足条件。但小编躬行证明这真的很难办,写出来的程序也有漏洞

所以就只能改变状态了

我们设dp[i][j][k]表示在前i个物品中选取、满足费用1的限制且满足费用2的限制的最大价值

是不是跟01背包很像?(01:dp[i][j]前i个物品中选取且满足费用的限制的最大价值)

如果你理解了01背包,状态转移方程应该就很好想了:

dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-c1[i]][k-c2[i]]+w[i]);

然后我们像优化01一样优化上述方程(注意循环要变顺序的哟(^U^)ノ~YO):

dp[j][k]=max(dp[j][k],dp[j-c1[i]][k-c2[i]]+w[i]);

代码:

#include<iostream>
#include<cstdio>
#define _for(i,a,b) for (int i=(a);i<(b);i++)//宏定义,懒人专用
using namespace std;
const int N=1e2+5,M=1e2+5;
int dp[N][M];
int main(){
    int n,v1,v2;
    cin>>n>>v1>>v2;
    _for(i,0,n){
        int c1,c2,w;
        cin>>c1>>c2>>w;
        for (int j=v1;j>=c1;j--){//注意枚举顺序   b
            for (int k=v2;k>=c2;k--){//a
                dp[j][k]=max(dp[j][k],dp[j-c1][k-c2]+w);
            }
        }
    }
    cout<<dp[v1][v2]<<endl;
    return 0;
}
//其实可以来一个#define _rep(i,a,b) for (int i=(a);i>=(b);i--)来替换a、b代码

下面举一道变形题(裸题):

 

 

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

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

相关文章

【几分醉意赠书活动 - 05期】 | 《编程语言系丛图书》

个人主页&#xff1a; 陈老老老板的博客主页传送门 几分醉意.的博客主页传送门 赠书活动 | 第五期 本期好书推荐&#xff1a;《编程语言系列丛书》 粉丝福利&#xff1a;书籍赠送&#xff1a;共计送出30本 参与方式&#xff1a;关注公众号&#xff1a;码上天空 回复关键词&…

如果高考要考编程的话?不敢想,不敢想......

前几天不是高考嘛。 高考确实是当前时代下&#xff0c;比较公平的一个比武台了。说是人生中一次逆天改命的机会我觉得也不为过。 毋庸置疑&#xff0c;高考确实非常重要。但是其实我站在现在这个时间点&#xff0c;距离高考已经过去了 多年时间&#xff0c;回望这段经历的时候…

JavaWeb(HTML/CSS)

一.web概念概述 JavaWeb&#xff1a; 使用Java语言开发基于互联网的项目 做什么&#xff1a;做网页&#xff0c;其架构有; C/S: Client/Server 客户端/服务器端 是&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;对于用户来说…

Java入门 —— 打开Java世界的大门

目录 一. 了解Java 二.Java入门 三.变量 一. 了解Java 1.什么是程序 ——计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 2.Java是如何诞生的 ——1990年&#xff0c;sun公司启动了绿色计划&#xff0c;1992年sun公司创建了oak语言&#xff0c;后改名为Java…

Vue.js中的两大指令:v-on和v-bind,实现页面动态渲染和事件响应

Vue.js中的两大指令&#xff1a;v-on和v-bind&#xff0c;实现页面动态渲染和事件响应 一、Vue指令&#xff08;一&#xff09;v-bind指令&#xff08;二&#xff09;v-on指令1. 基本使用&#xff08;1&#xff09;最基本的语法 2. Vue中获取事件对象(了解)3. v-on 事件修饰符4…

Vue 利用Canvas标签实现动态验证码校验(前端必备附源码)

文章目录 一、前言二、Canvas简介- 什么是Canvas?- Canvas的基本使用 三、动态验证码的具体实现- 在项目中创建 SIdentify.vue 文件- 再创建要使用该组件的文件&#xff0c;App.vue 一、前言 当我们在平时进行登录或者注册账号的时候&#xff0c;往往都会遇到验证动态验证码的…

高级网工必会组网方案,你pick哪一种?

企业组网非常考验网工的内功&#xff0c;选择何种组网方案、合适的网关位置、如何保证网关可靠性等等一系列问题&#xff0c;每个环节都考验网工的理论功底和实操经验。 大型企业如大型医院、银行、省市县政府单位、电厂、汽车行业等&#xff0c;网络的稳定性&#xff0c;往往…

JUC高级-0608

重新看JUC课程&#xff0c;选择周阳讲的JUC 1.前置知识 lombok插件 Lombok是一个Java库&#xff0c;它通过注解的方式&#xff0c;能够在编译时自动为类生成构造函数、getters、setters、equals、hashCode和toString方法&#xff0c;以及其他常用方法&#xff0c;从而使我们…

Monocle3个性化分析作图:拟时热图/拟时基因GO分析/拟时基因趋势分析

Mnocle3往期精彩内容&#xff0c;因为monocle2有问题&#xff0c;且官网也放弃了monocle2&#xff0c;目前用的比较主流的拟时方法就是monocle3了。Mnocle3我们也写过全面的内容&#xff0c;不论是基础的分析还是个性化分析&#xff1a;Monocle3&#xff08;1&#xff09;&…

【C#】并行编程实战:并行编程简介

本章内容为多线程编程入门知识&#xff0c;旨在介绍多线程的特点&#xff0c;以及提供了C#部分基础的多线程API使用。 1、进程与线程 这一小节包含大量概念和基础知识&#xff0c;虽然建议阅读但确实比较枯燥。 可以直接跳到后面的实际应用的章节。 进程 狭义定义&#xff1a;正…

2.数据表的基本操作

SQL句子中语法格式提示&#xff1a; 1.中括号&#xff08;[]&#xff09;中的内容为可选项&#xff1b; 2.[&#xff0c;...]表示&#xff0c;前面的内容可重复&#xff1b; 3.大括号&#xff08;{}&#xff09;和竖线&#xff08;|&#xff09;表示选择项&#xff0c;在选择…

思科(Cisco)7000交换机软件版本升级步骤

思科&#xff08;Cisco&#xff09;交换机软件版本升级步骤 一、准备软件版本 在思科官方网站&#xff08;思科官网传送门&#xff09;下载你需要的系统版本文件&#xff0c;将软件版本准备好拷贝到U盘。 二、准备设备 将交换机加电启动&#xff0c;通过CRT- console进行连接…

使用JMeter进行接口高并发测试

一般的网络接口测试&#xff0c;功能性测试postman较为好用&#xff0c;需要测试高并发的情况下&#xff0c;可以用Jmeter来进行测试&#xff0c;postman是串行&#xff0c;而Jmeter可以多线程并行测试。 官网 Apache JMeter - Apache JMeter™正在上传…重新上传取消https://j…

100个句子记3500个单词

Typical of the grassland dwellers of the continent is the American antelope, or pronghorn. [ˈtɪpɪkl]典型[ˈɡrɑːslnd]草原[dweləz]居民[ˈkɒntɪnənt]大陆 [ˈntɪləʊp] [prɒŋhɔːn] 1.美洲羚羊&#xff0c;或称叉角羚&#xff0c;是该大陆典型的草原动物…

Gradle版本目录(Version Catalog)

Gradle版本目录(Version Catalog) “版本目录是一份依赖项列表&#xff0c;以依赖坐标表示&#xff0c;用户在构建脚本中声明依赖项时可以从中选择。” 我们可以使用版本目录将所有依赖项声明及其版本号保存在单个位置。这样&#xff0c;我们可以轻松地在模块和项目之间共享依…

react-useId

// App.tsx const id Math.random();export default function App() {return <div id{id}>Hello</div> }如果应用是CSR&#xff08;客户端渲染&#xff09;&#xff0c;id是稳定的&#xff0c;App组件没有问题。 但如果应用是SSR&#xff08;服务端渲染&#xff…

Spring Boot 属性配置解析

基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解 属性配置介绍 Spring Boot 3.1.0 支持的属性配置方式与2.x版本没有什么变动&#xff0c;按照…

充电桩计量装置TK4800充电机(桩)现场校验仪检定装置

支持同时开展直流充电机现场校验仪和交流充电桩现场校验仪的检定工作&#xff0c;提高检定效率。 专用检定枪线&#xff1a;配有国标直流充电枪线及国标交流充电枪线&#xff0c;可直接接至交直流充电桩&#xff08;机&#xff09;现场校验仪开展检定工作&#xff0c;无需额外…

JMeter从数据库中获取数据并作为变量使用

目录 前言 1、JMeter连接MySQL数据库 2、线程组下新建一个 JDBC Connection Configuration 配置元件 3、实现数据库的查询-单值引用 4、实现数据库的查询-多值引用 总结&#xff1a; 前言 JMeter如何从数据库中获取数据并作为变量使用&#xff1f;这在我们使用JMeter做接…

企业转型在搭建BI时,需要注意什么

如今&#xff0c;商业智能BI在全世界范围内掀起了一股热潮&#xff0c;形成了一个庞大的市场&#xff0c;在信息化时代&#xff0c;企业需要借助BI来进行更好的成长。 在这种全新的社会、商业BI环境下&#xff0c;各行各业的企业都开始寻求探索新的商业模式&#xff0c;通过转…