【ETOJ P1024】无穷背包 题解(动态规划+完全背包)

2024-02-10 10:28

本文主要是介绍【ETOJ P1024】无穷背包 题解(动态规划+完全背包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

e e e 的背包容量为 m m m,现在商店里有 n n n 种商品。由于在梦境中,他可以零元购,商店里的每种商品都有无穷件,每件商品有一个价值 w i w_i wi 和体积 v i v_i vi

问小 e e e 最多可以带走多少价值的商品?

输入

第一行两个整数表示 m , n m, n m,n。( 1 ≤ m ≤ 1 0 5 , 1 ≤ n ≤ 500 1 ≤ m ≤ 10^5, 1 ≤ n ≤ 500 1m105,1n500

接下来 n n n 行,每行两个整数表示 w i , v i w_i, v_i wi,vi。( 1 ≤ w i ≤ 1 0 9 , 1 ≤ v i ≤ m 1 ≤ w_i ≤ 10^9, 1 ≤ v_i ≤ m 1wi109,1vim

输出

一行一个整数表示答案。

样例输入

10 3
2 1
5 3
10 4

样例输出

24

提示

解释:拿两件物品3,再拿两件物品1,得到价值最大为24。


思路

首先,读取背包容量 m m m 和商品种类数 n n n,然后读取每种商品的价值和体积。动态规划数组 dp 被定义来存储在给定背包容量下可以获得的最大价值。dp[j] 表示背包容量为 j j j 时的最大价值。

然后,对于每种商品 i i i,从其体积 v i v_i vi m m m 遍历背包的容量 j j j。如果选择了商品 i i i,背包的容量会减少 v i v_i vi,但是可以增加 w i w_i wi 的价值。因此,dp[j] 被更新为 dp[j]dp[j - v[i]] + w[i] 中的较大值,这表示在背包容量为 j j j 时,选择或者不选择商品 i i i 的两种情况下的最大价值。

最后,输出 dp[m],即在背包容量为 m m m 时,可以获得的最大价值。


AC代码

#include <algorithm>
#include <iostream>
#define ll long long
#define AUTHOR "HEX9CF"
using namespace std;const int N = 1e6 + 7;int m, n;
int w[N], v[N];
ll dp[N];int main() {cin >> m >> n;for (int i = 1; i <= n; i++) {cin >> w[i] >> v[i];}for (int i = 1; i <= n; i++) {for (int j = v[i]; j <= m; j++) {dp[j] = max(dp[j], dp[j - v[i]] + w[i]);}}cout << dp[m] << endl;return 0;
}

这篇关于【ETOJ P1024】无穷背包 题解(动态规划+完全背包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696850

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

基于Nacos实现SpringBoot动态定时任务调度

《基于Nacos实现SpringBoot动态定时任务调度》本文主要介绍了在SpringBoot项目中使用SpringScheduling实现定时任务,并通过Nacos动态配置Cron表达式实现任务的动... 目录背景实现动态变更定时机制配置化 cron 表达式Spring schedule 调度规则追踪定时

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC