背包问题——完全背包

题目

N N N种物品和一个容量是 V V V的背包,每种物品都有无限件可用。
i i i 种物品的体积是 v i v_i vi,价值是 w i w_i wi
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

输入格式
第一行两个整数, N N N V V V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N N N 行,每行两个整数 v i v_i vi, w i w_i wi,用空格隔开,分别表示第 i i i 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。

分析

状态表示

用一个数组f[i][j]来表示只看前i个物品,在总体积是j的情况下,总价值最大是多少。
那么,题目要求在背包容量为V的条件下,从N件物品中选取物品使得的总价值最大,状态表示应为f[N][V].

状态计算

在进行状态计算之前,先得对状态做一个划分。对于01背包,f[i][j]的状态只有两种:

不选第i个物品选第i个物品
f[i-1][j]f[i-1][j-v[i]] + w[i]

取两种状态的最大值
对于完全背包,物品可以取无限个,不过k最多为v
那么状态可以划分为:

不选第i个物品(选0个)选1个第i个物品选2个第i个物品选k个第i个物品
f[i-1][j]f[i-1][j-v[i]] + w[i]f[i-1][j-2*v[i]] + 2*w[i]f[i-1][j-k*v[i]] + k*w[i]

找到这些状态的最大值即可。
因此,我们只需要在0-1背包的基础上,多循环一次k

#include<iostream>
using namespace std;const int N = 1010;int n, m;
int f[N][N], v[N], w[N];int main(){cin >> n >> m;for(int i = 1; i <= n; i ++ )cin >> v[i] >> w[i];for(int i = 1; i <= n; i ++ )for(int j = 0; j <= m; j ++ )for(int k = 0; k * v[i] <= j; k ++ )f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]);//求出每一个 f[i][j]cout << f[n][m] << endl;
}

优化

上面的算法时间复杂度过高。
回顾下状态切分 对于f[i][j]来说

不选第i个物品选1个第i个物品选2个第i个物品选3个第i个物品
f[i-1][j]f[i-1][j-v[i]] + w[i]f[i-1][j-2*v[i]] + 2*w[i]f[i-1][j-3*v[i]] + 3*w[i]

而巧就巧在f[i][j-v[i]]的状态划分为

不选第i个物品选1个第i个物品选2个第i个物品
f[i-1][j-v[i]]f[i-1][j-2*v[i]] + w[i]f[i-1][j-3*v[i]] + 2*w[i]

我们发现,f[i][j]中选择1–k个第i个物品和f[i][j-v[i]]中选择k–1个第i个物品正好是对应的(只相差w[i])
因此,对于f[i][j],选择k个第i个物品的最大值为f[i][j-v[i]] + w[i],我们不再需要循环k个物品了,状态划分简化为:

不选第i个物品选择k个第i个物品
f[i-1][j]f[i][j-v[i]] + w[i]

取二者的最大值即可。
代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1002;
int n, m;
int f[N][N];
int v[N], w[N];int main(){cin >> n >> m;for (int i = 1; i <= n; i++) scanf("%d%d", &v[i], &w[i]);for (int i = 1; i <= n; i++) {for (int j = 0; j <= m; j++) {f[i][j] = f[i-1][j];if (j >= v[i]) {f[i][j] = max(f[i][j], f[i][j-v[i]] + w[i]);}}}cout << f[n][m] << endl;return 0;
}

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

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

相关文章

JDBC和连接池

JDBC和连接池 大纲 JDBC连接数据库的方式JDBCUtils事务 具体案例 JDBC 需求&#xff1a;满足Java程序能对多个不同的数据库进行操作&#xff0c;而创建了一种接口&#xff0c;实现对数据库的规范 连接数据库的方式 1.方法1 先创建一个Driver对象&#xff0c;然后设置…

【RabbitMQ】RabbitMQ的交换机

交换机类型 在上文中&#xff0c;都没有交换机&#xff0c;生产者直接发送消息到队列。而一旦引入交换机&#xff0c;消息发送的模式会有很大变化&#xff1a;可以看到&#xff0c;在订阅模型中&#xff0c;多了一个exchange角色&#xff0c;而且过程略有变化&#xff1a; Pub…

Android bp构建引入其他模块头文件

最近做项目过程中经常遇到Android.bp文件引入其他模块的头文件库&#xff0c;总是记不住bp的写法&#xff0c;这里做个记录 1.产生头文件库 2.其他的模块应用引入头文件库 不由想起来老师的名句&#xff1a;好记忆不如烂笔头。

Linux虚拟机上离线安装ansible awx_亲测成功

Linux虚拟机上离线安装ansible awx_亲测成功 可自行去下载相关包,也可以给我评论留言,我发给大家 ansible awx离线安装----虚拟机上安装 成功----------------------------- python -V 2.7.5tar -zxvf setuptools-20.0.tar.gz cd setuptools-20.0 python setup.py installtar…

基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测

目录 完整代码和数据下载链接:基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937452 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于遗传算法改…

【Python使用】python高级进阶知识md总结第3篇:静态Web服务器-返回指定页面数据,静态Web服务器-多任务版【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

nacos服务注册和发现

打开nacos console&#xff1a;http://192.168.1.30:8848/nacos&#xff0c;创建名称空间 添加依赖&#xff0c;在 api 模块中添加对应依赖&#xff08;service和service-order从api传递&#xff09; <dependency> <groupId>com.alibaba.cloud</groupId> …

拥抱灵活性与可扩展性:为什么NoSQL数据库是现代应用的理想选择

引言&#xff1a; 随着数据在当今社会中的重要性不断增加&#xff0c;数据存储技术也在不断演变。传统的SQL数据库虽然在处理结构化数据方面表现出色&#xff0c;但随着数据的多样性和规模的迅速增长&#xff0c;它们开始显现出一些局限性。在这样的背景下&#xff0c;NoSQL数…

Linux操作系统Linux—C编程

一、编写C程序 1.设置vim编辑器 &#xff08;1&#xff09;vim编辑器tab键默认为8个空格键不适合编程使用&#xff0c;因此我们需要修改为4个空格。 第一步&#xff1a;打开vimrc文件 sudo vi /etc/vim/vimrc 第二步&#xff1a;文件末行添加一句set ts4 &#xff08;2&#x…

react recharts饼图 及配置项

<Pie>&#xff1a;指定饼图的数据和样式。 data&#xff1a;设置图表使用的数据数组。dataKey&#xff1a;指定用于饼图切片面积计算的数据字段。nameKey&#xff1a;指定用于显示在图例和提示框中的数据字段。cx 和 cy&#xff1a;设置饼图中心的位置。outerRadius&…

笔记79:ROS入门之前的准备

一、ROS是什么 ROS其实是一个伪操作系统&#xff0c;是基于Liunx操作系统的一个用于机器人各个节点之间通信的系统&#xff1b;ROS制定了一系列规则使得每个节点之间遵循相同的通信规则&#xff0c;使得每个人都可以有一个守则区遵守开发自己的节点&#xff0c;也能和别人开发…

Linux -- 线程概念和控制

一 什么是线程 1.1 线程的引出 我们开始理解一下Linux中的线程。我们以前说过&#xff0c;一个进程被创建出来&#xff0c;要有自己对应的进程PCB的&#xff0c;也就是 task_struct&#xff0c;也要有自己的地址空间、页表&#xff0c;经过页表映射到物理内存中。所以在进程角…

python基础练习 Fibonacci数列

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 Fibonacci数列的递推公式为&#xff1a;FnFn-1Fn-2&#xff0c;其中F1F21。 当n比较大时&#xff0c;Fn也非常大&#xf…

基于java ssm springboot女士电商平台系统

基于java ssm springboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…

WebPack自动吐出脚本

window.c c; window.res ""; window.flag false;c function (r) {if (flag) {window.res window.res "${r.toString()}" ":" (e[r] "") ",";}return window.c(r); }代码改进了一下&#xff0c;可以过滤掉重复的方…

web基础05-jQuery

目录 一、jQuery 1.概述 2.原生js与jQuery对比 3.特点 4.使用 &#xff08;1&#xff09;入口函数 &#xff08;2&#xff09;语法 &#xff08;3&#xff09;jQuery选择器 5.方法 &#xff08;1&#xff09;获取属性值&#xff1a; &#xff08;2&#xff09;删除属…

WinForm 修改TableControl背景和标签

在界面设计中&#xff0c;TableControl控件经常使用。默认设置中&#xff0c;TabControl的背景和标签样式。接下来我们将学习如何修改TableControl的标签选项、修改TabControld的背景色或背景图片。页面效果如下&#xff1a; 简述原理 TableControl项目属性DrawMode&#xff0c…

【开源工程】数字孪生工厂~工业上楼解决方案

飞渡科技数字孪生轻工厂管理平台&#xff0c;基于数字孪生技术驱动的智能&#xff0c;结合物联网IOT实现的联接&#xff0c;以及大数据分析生成的融合共享数据&#xff0c;实现生产过程的智能化监控和管理&#xff0c;实现设备之间的互联互通和协同工作。 通过智能算法&#xf…

前端报错404,nginx正常、gateway没有转发请求

问题描述&#xff1a;前端报错 404 Not Found 原因&#xff1a;nacos中对应服务没有上线&#xff0c;下线后&#xff0c;可以启动本地服务&#xff0c;然后在测试上调试代码。&#xff01;&#xff01; 记住重启对应服务&#xff0c;也不会自动上线。

Linux-TCP并发模型-013

1【TCP】多线程模型 2【IO】模型 2.1阻塞IO 没有数据到来时&#xff0c;可以让任务挂起&#xff0c;节省CPU资源开销&#xff0c;提高系统效率2.2非阻塞IO 程序未收到数据时一直执行&#xff0c;效率很低2.3异步IO 只能绑定一个文件描述符用来读取数据2.4多路复用IO 2.4.…