[动态规划]完全背包问题及其优化

news2024/11/25 3:24:22

题目描述

有N种物品和一个容量为 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是Ci,价值是Wi。求解在不超过背包容量的情况下,能够获得的最大价值。

54E9C51263E1462585A8F6595841EEC0.jpg


输入

第一行为两个整数N、V(1≤N,V≤10000),分别代表题目描述中的物品种类数量N和背包容量V。

后跟N行,第 i 行两个整数Ci、Vi,分别代表每种物品的体积和价值。

输出

输出一个整数,代表可获得的最大价值。


样例输入

5 20
2 3
3 4
10 9
5 2
11 11
样例输出
30

数据规模与约定

时间限制:1s

内存限制:64M

对于100%的数据,1≤N,V≤10000。

解题分析1

还是先上二维dp数组的做法。dp[i][j]代表前i个物品,背包容量为j的情况下能得到的最大价值。首先,我们可以采用容斥原理,对于第i个物品,如果我们不取它,那么我们的dp[i][j]=dp[i-1][j],这点没有问题,如果我们取它,dp[i][j]=dp[i][j-w[i]]+v[i],其中w[i]代表这个物品的重量,v[i]代表这个物品的价值,为什么我们又是考虑i呢?因为物品的数量是无限的,我们可以继续考虑这个物品。

代码实现1
#include <iostream>
#define MAXN 10005
using namespace std;

int N,V,C[MAXN],v[MAXN],dp[MAXN][MAXN];

int main(){
	scanf("%d%d",&N,&V);
	for(int i=1;i<=N;i++){
		scanf("%d%d",&C[i],&v[i]);
	}
	for(int i=1;i<=N;i++)
		for(int j=1;j<=V;j++){
			dp[i][j]=dp[i-1][j];
			if(C[i]<=j) 
			dp[i][j]=max(dp[i][j],dp[i][j-C[i]]+v[i]);
		}
	printf("%d\n",dp[N][V]);
	return 0;
}

稍稍优化一下内存

#include <iostream>
#define MAXN 10005
using namespace std;

int N,V,C[MAXN],v[MAXN],dp[2][MAXN];

int main(){
	scanf("%d%d",&N,&V);
	for(int i=1;i<=N;i++){
		scanf("%d%d",&C[i],&v[i]);
	}
	for(int i=1,ind,rind;i<=N;i++){
		ind=i%2,rind=(i-1)%2;
		for(int j=1;j<=V;j++){
			dp[ind][j]=dp[rind][j];
			if(C[i]<=j) 
			dp[ind][j]=max(dp[ind][j],dp[ind][j-C[i]]+v[i]);
		}
	}
	printf("%d\n",dp[N%2][V]);
	return 0;
}

优化一下时间

#include <iostream>
#define MAXN 10005
using namespace std;

int N,V,dp[2][MAXN];

int main(){
	scanf("%d%d",&N,&V);
	for(int i=1,ind,rind,c,v;i<=N;i++){
		ind=i%2,rind=(i-1)%2;
		scanf("%d%d",&c,&v);
		for(int j=1;j<=V;j++){
			dp[ind][j]=dp[rind][j];
			if(c<=j) 
			dp[ind][j]=max(dp[ind][j],dp[ind][j-c]+v);
		}
	}
	printf("%d\n",dp[N%2][V]);
	return 0;
}

终极优化,注意,这里必须从正向开始打表,因为我们在状态转移的时候考虑的dp[i][j-c]+v必须是更新过后的,这是和0,1背包最大的区别。

#include <iostream>
#define MAXN 10005
using namespace std;

int N,V,dp[MAXN];

int main(){
	scanf("%d%d",&N,&V);
	for(int i=1,c,v;i<=N;i++){
		scanf("%d%d",&c,&v);
		for(int j=c;j<=V;j++){
			dp[j]=max(dp[j],dp[j-c]+v);
		}
	}
	printf("%d\n",dp[V]);
	return 0;
}

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

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

相关文章

java 怎么读取文件创建时间?

Java读取文件创建时间的实现方法 在工作时候&#xff0c;我们有时候需要获取到文件的最后更新时间&#xff0c;根据最近更新时间&#xff0c;来处理其他业务。那么&#xff0c;在Java中&#xff0c;怎么获取到文件最后更新时间呢&#xff1f;接下来凯哥(个人号&#xff1a;凯哥…

教你应对Github最新的2FA二次验证! 无地区限制, 你的Github账户可能被封禁!

文章目录 2FA 定义2FA验证方法1 硬件令牌2.推送通知3.SMS 验证4 基于语音的身份验证 解决方案安装身份验证器的谷歌浏览器插件打开 github 的二维码&#xff0c;直接扫描 2FA 定义 双因素身份验证 (2FA) 是一种身份和访管理安全方法&#xff0c;需要经过两种形式的身份验证才能…

大数据----MapReduce实现统计单词

目录 一、简介二、实现单词统计数据准备编程MapReduceJob 三、运行四、结果 一、简介 Hadoop MapReduce 是一个编程框架&#xff0c;它可以轻松地编写应用程序&#xff0c;以可靠的、容错的方式处理大量的数据(数千个节点)。 正如其名&#xff0c;MapReduce 的工作模式主要分…

每日一题——Leetcode908

方法一 数学思想&#xff1a; 其实就是看数组中最大值和最小值一个加上k一个减去k是否能刚好凑到0&#xff0c;如果不能就是两者之差 var smallestRangeI function(nums, k) {var min9999,max-1for(var i0;i<nums.length;i){min Math.min(min,nums[i])max Math.max(max…

Python数据分析 Matplotlib篇 基本方法初识 (第1讲)

Python数据分析 Matplotlib篇(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

leetcode 1576. 替换所有的问号(easy)(优质解法)

链接&#xff1a;1576. 替换所有的问号 代码&#xff1a; class Solution {public String modifyString(String s) {char[] charSs.toCharArray();int lengthcharS.length;//遍历找到 &#xff1f;for(int i0;i<length;i){if(charS[i]?){//遍历 a ~ z 选择一个合适的字符来…

Linux怎么解压zip格式文件?

Linux解压命令zip是一种常见的文件压缩格式&#xff0c;用于把文件打包成一个zip文件&#xff0c;当我们需要共享或是发送时&#xff0c;能够更快速的发送&#xff0c;储存起来能够减少储存空间。那我们在Linux上怎么使用解压命令zip来解压zip格式文件呢&#xff1f;我们一起来…

MySQL 大数量left join 太慢语句拆分的一种办法

最近做点股市分析&#xff0c;发现日线数据已经达到了千万级&#xff0c;想做个两个日期之间的收盘价比较&#xff0c;例如第一周1月3日和1月6日的涨幅&#xff0c;很简单的语句&#xff0c;如下&#xff1a; select a.scode,s. name,a.sdate sdate1,a.close close1, b.sdate …

nodejs+vue+ElementUi房屋房产销售预约看房系统bqv00

完成房产销售系统&#xff0c;对房源的信息、用户信息及各种资料进行收集和科学的管理&#xff0c;该系统的功能基本可以满足当前市面上的小型房产企业对于房产销售的基本要求&#xff0c;收集各个地区的房源信息并进行分类管理&#xff0c;用户通过注册账号登录网站查询房源信…

小狐狸ChatGPT付费创作系统 前端对话提示undefined index:temperature解决方法

很多会员使用着ChatGPT付费创作系统&#xff0c;特别是新安装系统后前端输入对话时提示错误undefined index:temperature&#xff0c;检查了反代、检查了KEY均正常&#xff0c;这问题主要是因为后台设置里新用户免费送对话次数为空&#xff0c;没设置赠送次数原因&#xff0c;导…

【BEV感知算法概述——下一代自动驾驶感知算法】

文章目录 BEV感知算法概念BEV感知算法数据集介绍BEV感知算法分类BEV感知算法的优劣小结 BEV感知算法概念 Bird’s-Eye-View&#xff0c;鸟瞰图&#xff08;俯视图&#xff09;。BEV感知算法存在许多的优势。 首先&#xff0c;BEV视图存在遮挡小的优点&#xff0c;由于视觉的透…

腾讯面试:SaaS多租户,如何设计?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 多租户设计&#xff0c;如何 技术选型&#xff…

分布式事务2PC二阶段提交详解

文章目录 概述和概念执行过程和工作流程特点优劣势应用场景总结demo代码样例 概述和概念 二阶段提交&#xff08;2PC&#xff09;是一种用于确保在分布式系统中的所有节点在进行事务提交时保持一致性的算法 二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09…

JWT、session、token区别和实现

JWT、session、token区别和实现 这里需要用到Redis和JWT。 springboot版本是3.2.1 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><…

vitis HLS中实现canny算法的IP核

一、前言 canny边缘检测主要用于提取图像的边缘&#xff0c;是最常用且有效的边缘检测算法。在AMD赛灵思提供的库函数中&#xff0c;使用xf::cv::Canny和xf::cv::EdgeTracing两个函数实现canny边缘提取。本文举例说明如何在vitis HLS 2023.1中实现canny算法。 二、xf::cv::Cann…

GoogLeNet(V1)

目录 一、GooLeNet介绍 1、模型设计的motivation 2、Inception块 3、GoogLeNet架构 4、Inception后续变种 5、总结 二、代码实现 1、Inception块 2、GoogLeNet模型 3、训练模型 4、总结 一、GooLeNet介绍 GoogLeNet是由Google团队于2014年提出的深度卷积神经网络架构…

c++缺省参数与函数重载(超详细)

文章目录 前言一、缺省参数1.缺省参数的概念与使用2.缺省参数的分类3.缺省参数注意事项 二、函数重载1.什莫事函数重载2.函数重载的几种形式3.函数重载与缺省值的结合4.为什么c支持函数重载&#xff1f;&#xff1f; 总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Cc缺…

【MySQL】数据库之索引的增删改查

目录 一、索引是什么 二、索引的作用 三、工作方式 四、创建索引的依据&#xff1a; 五、索引的分类 六、索引的增删改查&#xff08;索引是一种对象&#xff0c;与字段类似是命令&#xff09; 索引的添加 ​编辑第一种&#xff1a;普通索引的创建 第二种&#xff1a;唯…

C++ 比 C语言增加的新特性 2

1.C新增了带默认值参数的函数 1.1 格式 格式&#xff1a;返回值 函数名&#xff08;参数1初始值1&#xff0c;..........&#xff09;{} 例如&#xff1a;void function&#xff08;int a10&#xff09;{} 调用&#xff1a;不需要更改参数的值&#xff1a;function&#x…

001 图书增删改查 SSM MySQL

技术框架&#xff1a;Spring SpringMVC Mybatis JSP MySQL 001 图书增删改查 SSM MySQL package com.demo.controller;import com.demo.pojo.Book; import com.demo.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.spri…