备战蓝桥杯---动态规划之背包问题引入

先看一个背包问题的简单版:

如果我们暴力枚举可能会超时。

但我们想一想,我们其实不关心怎么放,我们关心的是放后剩下的体积。

用可行性描述即可。

于是我们令f[i][j]表示前i个物品能否放满体积为j的背包。

f[i][j]=f[i-1][j]||f[i-1][j-v[i]];  f[0][0]=1;

然后,我们去找jmax并真的值即可。

这是用图表示:

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int v,n,a[40][20005],v1[36];
int main(){cin>>v>>n;for(int i=1;i<=n;i++) scanf("%d",&v1[i]);a[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=v;j++){if(j>=v1[i]) a[i][j]=a[i-1][j]||a[i-1][j-v1[i]];else a[i][j]=a[i-1][j];}}for(int i=v;i>=0;i--){if(a[n][i]==1){cout<<v-i;break;}}
}

我们用0/1滚动优化一下空间:

#include<bits/stdc++.h>
using namespace std;
int v,n,a[2][20005],v1[36];
int main(){cin>>v>>n;for(int i=1;i<=n;i++) scanf("%d",&v1[i]);a[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=v;j++){if(j>=v1[i]) a[i%2][j]=a[(i-1)%2][j]||a[(i-1)%2][j-v1[i]];else a[i%2][j]=a[(i-1)%2][j];}}for(int i=v;i>=0;i--){if(a[n%2][i]==1){cout<<v-i;break;}}
}

进一步,我们想想因为当前行是上一行v1[i]前体积的继承,换句话说,我们可以从v[i]开始枚举,前面的让他继承上一行即可,于是我们可以把数组优化成一维。

但是,这会出现一个问题,我们拿3举例:

当我们在看6时,发现6-3=3为1,于是6也为1,同理,3的倍数的体积全变1,而事实上,我们应该只有3与0为1.

问题在于我们不知道这个真是来自上一行还是这一行刚刚跟新的。

于是,我们可以倒着循环,因为我们发现要跟新依据的都是当前位置前面的,这样,我们这行跟新的只会在后面,这就是就地滚动。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int v,n,a[20005],v1[36];
int main(){cin>>v>>n;for(int i=1;i<=n;i++) scanf("%d",&v1[i]);a[0]=1;for(int i=1;i<=n;i++){for(int j=v;j>=v1[i];j--){a[j]=a[j]||a[j-v1[i]];}}for(int i=v;i>=0;i--){if(a[i]==1){cout<<v-i;break;}}
}

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

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

相关文章

怎么开启耳穴实操的道路

一.背景 前面的文章耳穴为什么有用&#xff1f;-CSDN博客&#xff0c;我说明了耳穴为什么有用、又是很安全的。 然后又告诉你了颈椎痛的耳穴配方用程序员的思维学习耳穴调理的第一个配方“颈椎病”-CSDN博客。 大胆放手去实操吧&#xff01; 二.工具用什么 1.耳穴贴 由一…

K210如何下载程序

一、打开资料包里提供的K-Flash程序烧录软件 二、选择串口 三、选择波特率 四、选择In-Chip&#xff0c;烧录到Flash芯片里面&#xff0c;重新上电还会运行程序 五、如果选择In - Memory&#xff0c;这次可以运行&#xff0c;但下次重新上电就不会保持这次的程序了。 六、选择固…

火星符号运算 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 已知火星人使用的运算符号为 #和$ 其与地球人的等价公式如下 x#y2*x3*y4 x$y3*xy2x y是无符号整数。地球人公式按照c语言规则进行计算。火星人公式中&#xff0…

leetcode:63.不同路径二

dp数组含义&#xff1a;由初始位置到最终位置路径个数 递推公式&#xff1a;如果没有障碍再进行递推公式 初始化&#xff1a;1.若起始位置和终止位置有障碍路径个数为0 2.dp[i][0] 1和dp[0][j] 1的for循环条件都需要加上一个and dp[i][0] 0和and dp[0][j] 0. 3.遍历顺序…

Vue-Vue3 集成编辑器功能

1、安装依赖 编辑器插件需要安装 wangeditor/editor 和 wangeditor/editor-for-vue 两个插件 npm install wangeditor/editor --savevue3运行如下命令安装 npm install wangeditor/editor-for-vuenext --savevue2运行如下命令安装 npm install wangeditor/editor-for-vue -…

【前端web入门第四天】01 复合选择器与伪类选择器

文章目录: 1. 复合选择器 1.1 后代选择器 1.2 子代选择器 1.3 并集选择器1.4 交集选择器(了解) 2.伪类选择器 2.1 伪类-文本2.2 伪类-超链接&#xff08;拓展) 1. 复合选择器 什么叫复合选择器? 由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 复合选择器的作…

Peter算法小课堂—枚举优化

哈哈哈&#xff0c;新年快乐&#xff01;这一次Peter将要给大家讲一讲轻松、摆烂的算法—枚举&#xff01;咋就是说呀&#xff0c;枚举这个玩意我语法就会了。但大家想想&#xff0c;咱们CSP考试时&#xff08;除了没过初赛的&#xff09;只给1秒&#xff0c;大家想想&#xff…

macOS Sonoma 14.3.1(23D60)发布

系统介绍 黑果魏叔2 月 9 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.3.1 更新&#xff08;内部版本号&#xff1a;23D60&#xff09;&#xff0c;本次更新距离上次发布隔了 17 天。 魏叔 查询苹果官方更新日志&#xff0c;macOS Sonoma 14.3.1 修复内容和 …

二层交换机配置以太网通道

实验大纲 二层聚合端口配置 1.构建网络拓扑结构图 2.修改交换机名字 3.创建聚合组进入聚合接口模式 4.将端口绑定到聚合端口&#xff08;接口模式&#xff09; 5.聚合接口下端口配置&#xff08;聚合接口模式) 6.具体配置 7.验证端口通道1的状态 8.配置ip 9.测试连通…

Qt安装配置教程windows版(包括:Qt5.8.0版本,Qt5.12,Qt5.14版本下载安装教程)(亲测可行)

目录 Qt5.8.0版本安装教程Qt5.8.0版本下载安装 Qt5.12.2版本安装教程下载安装 Qt 5.14.2安装教程下载安装和创建项目 参考视频 QT为嵌入式系统提供了大量的库和可重用组件。 WPS Office&#xff0c;咪咕音乐&#xff0c;Linux桌面环境等都是QT开发的。 Qt5.8.0版本安装教程 Q…

【C++第二阶段】运算符重载-【+】【cout】【++|--】

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 运算符重载加法运算符重载重载左移运算符递增|减运算符重载 运算符重载 加法运算符重载 What 普通的加减乘除&#xff0c;只能应付C中已给定的数据类型的运…

Spring Boot 笔记 003 Bean注册

使用Idea导入第三方jar包这种方法是不对的 使用maven命令导入jar包 官网下载maven Maven – Download Apache Maven 解压缩后在命令行输入命令&#xff0c;注意看输出的结果&#xff0c;安装的是不是你本地的maven仓库 mvn install:install-file -Dfile"D:\common-pojo-2…