网站建设需求策划书/产品推广方案ppt

网站建设需求策划书,产品推广方案ppt,南京高端网站制作,做代购直接网站下单背包问题 ![[背包问题.png]] 01背包 1.题意概要:有 n n n个物品和一个容量为 V V V的背包,每个物品有重量 w i w_i wi​和价值 v i v_i vi​ 两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容…

背包问题

![[背包问题.png]]

01背包

1.题意概要:有 n n n个物品和一个容量为 V V V的背包,每个物品有重量 w i w_i wi和价值 v i v_i vi 两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量
要求:每个物品只能拿一次,所以每个物品只有拿或不拿两种状态,故称01背包
2.状态:dp[i][j]表示到第i个物品为止(不一定拿),到容量j为止,背包的最大价值
状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v)(注意先判断j>=w)(不关心有没有拿,只关心最大价值)
最终状态:dp[n][V]

小明的背包1

学习:
(1)模版题,可以不用开w[i],v[i]数组记录,反正是一个一个物品枚举的
代码:

#include <bits/stdc++.h>using namespace std;const int N=1e2+10,V=1e3+10;
int n,vol,dp[N][V];int main(){ios::sync_with_stdio(false);cin>>n>>vol;for(int i=1;i<=n;i++){int w,v;cin>>w>>v;for(int j=1;j<=vol;j++){//判断是否越界,即能不能放下第i个物品 if(j>=w)	dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v);else dp[i][j]=dp[i-1][j];}}cout<<dp[n][vol];return 0;
}
01背包一维滚动数组优化

学习:
(1)二维数组的第一维度dp[i]dp[i-1]本质就是第i-1层的值来转移给第i层,就是用遍历i来实现的,因此可以优化为滚动一维数组,让前面的旧值转移给后面的新值,所以一个维度dp[j]就够了,表示背包容量到j为止的最大价值,状态转移方程:
dp[j]=max(dp[j],dp[j-w]+v)
(2)背包容量倒序遍历,从 V V V开始 w i w_i wi,原因如下图:
![[01背包优化图.png]]
黄色块为旧值,绿色块为新值,左侧二维dp[i]的绿色新值都是由dp[i-1]黄色旧值转移而来,所以背包容量从前往后或从后往前无所谓,而右侧一维只能是黄色旧值转移给绿色新值,所以从后往前遍历,遇到个新值dp[j],从前面的旧值dp[j-w]转移过来,如果从前往后遍历,会出现dp[j-w2]dp[j-w2-w1]转移过一次,变成新值(不再是旧值dp[j-w2]),dp[j]新值dp[j-w2]转移过来,相当于加上了两次物品,例如:

        w    v
物品
1       1    2
j                0  1  2
dp[j](从前往后)   0  2  4(出现问题,考虑了两次物品1)
dp[j](从后往前)   0  2  2    
小明的背包1优化代码
#include <bits/stdc++.h>using namespace std;
const int V=1e3+10;
int n,vol,dp[V];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>vol;for(int i=1;i<=n;i++){int w,v;cin>>w>>v;for(int j=vol;j>=w;j--){ //倒序遍历 dp[j]=max(dp[j],dp[j-w]+v);}}cout<<dp[vol];return 0;
}
背包与魔法

学习:
(1)这题是01背包的变体,因为多了一个是否使用魔法,且最多使用一次,就相当于状态dp多了一个维度的变量(这个思想很重要),就有两大种状态dp[j][0],dp[j][1],三种状态转移:1.不加入物品2.加入物品不使用魔法3.加入物品使用魔法,以及相应的状态转移方程

//不使用魔法,一般的一维01背包
dp[j][0]=max(dp[j][0],dp[j-w][0]+v); 
dp[j][1]=max(dp[j][1],dp[j-w][1]+v);
//使用魔法
if(j>=(w+k))	dp[j][1]=max(dp[j][1],dp[j-(w+k)][0]+2*v);//精华所在

(2)状态转移方程在同一个反向遍历j下转移,表示对当前物品的转移,因为j最小到w,所以第二种状态转移方程要有个判断j>=(w+k)
(3)求多个元素的最大值,中间套个列表({})即可
maxn=max({1,2,3,4})
代码:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=2e3+10,M=1e4+10;
int n,m,k;
ll dp[M][2]; //第一维度为背包重量j,第二维度表示是否使用魔法 int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>m>>k;for(int i=1;i<=n;i++){	int w,v;cin>>w>>v;	for(int j=m;j>=w;j--){//不使用魔法,一般的一维01背包dp[j][0]=max(dp[j][0],dp[j-w][0]+v); dp[j][1]=max(dp[j][1],dp[j-w][1]+v);//使用魔法if(j>=(w+k))	dp[j][1]=max(dp[j][1],dp[j-(w+k)][0]+2*v); }}cout<<max(dp[m][0],dp[m][1]);return 0;
}

完全背包

(1)特征:每个物品有无限多个,可以被拿无限多次
(2)状态dp[j]表示到体积j为止的最大价值状态转移方程:
dp[j]=max(dp[j],dp[j-w]+v)跟一维01背包类似,但是不同点在于完全背包要从前往后遍历,这样每个物品能被拿无限多次,用新数据来更新新数据,而一维01背包要从后往前遍历,确保每个物品只拿一次,用旧数据来更新新数据

小明的背包2

学习:
(1)模版题
代码:

#include <bits/stdc++.h>using namespace std;
const int V=1e3+10;
int n,vol,dp[V];int main(){ios::sync_with_stdio(false);cin>>n>>vol;for(int i=1;i<=n;i++){int w,v;cin>>w>>v;for(int j=w;j<=vol;j++){ //正序遍历 dp[j]=max(dp[j],dp[j-w]+v);}}cout<<dp[vol];return 0;
}

多重背包

(1)特征:第i个物品有 s i s_i si个,共有s+1种状态(取0,1,2…s个)
(2)核心解决办法: s i s_i si个第i个物品当成独立的s个物品(遍历s次即可),每个 s i j s_ij sij物品就只有一个,就是01背包问题

小明的背包3

学习:
(1)多重背包模版题
代码:

#include <bits/stdc++.h>using namespace std;
const int V=2e2+10;
int n,vol,dp[V];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>vol;for(int i=1;i<=n;i++){int w,v,s;cin>>w>>v>>s;//遍历s次,相当于把第i个物品拆成s个i_s物品,每个i_s物品只有一个,为01背包问题for(int k=1;k<=s;k++){//01背包倒序遍历 for(int j=vol;j>=w;j--){dp[j]=max(dp[j],dp[j-w]+v);}} }cout<<dp[vol];return 0;
}
二进制优化多重背包

(1)将s个物品拆分成s组,每组一个的经典多重背包时间复杂度为O(n*s*V),s过大会超时
(2)因为任意一个数都有其对应的二进制数,令s=1+2+4+8+…+其他,一个物品可以分为约log2(s)组,就可以将几个二进制数组合表示0-s这s+1种中的任意状态,例如:
s=14=1+2+4+7(其他),要取10个物品,就相当于依次取1,2,7个物品即可,
所以可以将物品数量拆分为多个二进制组合,减少状态转移次数
(3)修改s的遍历即可,不再是1个1个加,而是倍数乘,而2个物品对应修改为2w,2v即可,最终的复杂度为O(n*log2(s)*V)

新一的宝藏搜寻加强版

学习:
(1) s i s_i si最大能到2e4,普通多重背包会超时,需要二进制优化,记得最后一个剩余的数要单独遍历一次
代码:

#include <bits/stdc++.h>using namespace std;
const int V=2e4+10;
int n,vol,dp[V];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>vol;for(int i=1;i<=n;i++){int w,v,s;cin>>w>>v>>s;int t=0;//t为二进制数累加和 for(int k=1;(k+t)<=s;k*=2){t+=k;//01背包倒序for(int j=vol;j>=k*w;j--){dp[j]=max(dp[j],dp[j-k*w]+k*v);}}//最后剩余部分为s-t for(int j=vol;j>=(s-t)*w;j--){dp[j]=max(dp[j],dp[j-(s-t)*w]+(s-t)*v);}}cout<<dp[vol];return 0;
}

二维费用背包

(1)特征:物品除了价值v,体积w两个特征外,还多了一个重量m特征,现在有两个限制条件:体积不超过W和重量不超过M的最大价值
(2)解决方法:一维01背包变成二维即可,仍然倒序更新,dp[i][j]表示体积到i为止,重量到j为止的最大价值,状态转移方程:dp[i][j]=max(dp[i][j],dp[i-w][j-m]+v)

小蓝的神秘行囊

学习:
(1)二维费用背包模版题
代码:

#include <bits/stdc++.h>using namespace std;
const int V=105,M=105;
int n,vol,mm,dp[V][M];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>vol>>mm;for(int i=1;i<=n;i++){int v,m,w;cin>>v>>m>>w;//二维倒序遍历for(int j=vol;j>=v;j--){for(int k=mm;k>=m;k--){dp[j][k]=max(dp[j][k],dp[j-v][k-m]+w);}}}cout<<dp[vol][mm];return 0;
}

分组背包

(1)特征:共有n组物品,每组物品里面有s个物品,每个物品有对应的w和v,每组物品最多只能取一个(区别所在),所有状态转移的第一维度是组,且没用一维优化,因为每一组的w和v有多个,不是固定的
(2)解决问题:dp[i][j]表示到第i组为止,体积j为止的最大价值,状态转移方程(好好理解)

dp[i][j]=dp[i-1][j] //初始化这一组都不取,就是上一组的状态(01背包是通过一个状态转移方程全做了)
dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v) //注意第一个是dp[i][j],而不是dp[i-1][j],因为每一组最多取一个物品,相当于比较取第i组取之前某个物品的最大价值(dp[i][j])和第i组取当前这个物品的最大价值(dp[i-1][j-w]+v)相比较

(3)正序倒序无所谓,因为两个维度了

小明的背包5

代码:

#include <bits/stdc++.h>using namespace std;
const int N=105,V=105;
int n,vol,dp[N][V];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>vol;//遍历每一组for(int i=1;i<=n;i++){int s;cin>>s;//这一组商品都不拿,等价于初始化dp[i][j] for(int j=0;j<=vol;j++)	dp[i][j]=dp[i-1][j]; //遍历每一组的每一个物品,考虑拿不拿 while(s--){int w,v;cin>>w>>v;//从上一组转移过来,而不是从上一个物品转移过来 for(int j=w;j<=vol;j++){dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v); //第一个是dp[i][j],保证每一组最多取一个物品 }} } cout<<dp[n][vol];return 0;
}

蓝桥杯真题

砝码称重

学习:
(1)不是典型的背包问题,但是将动态规划的思想运用的淋漓尽致
首先定义一个状态:dp[i][j]表示到第i个砝码为止,到重量j为止,是否可以称出重量j,为0/1,
再考虑i和j的边界,i最多到n,而j最多到sum,不是到V
再考虑它由哪几种状态转移而来:
1.不拿砝码,由dp[i-1][j]转移而来
2.拿砝码放左侧,由dp[i-1][abs(j-w)](放左侧相当于加上w,由于镜像,abs(j-w)->j)
3.拿砝码放右侧,由dp[i-1][j+w]转移而来(放右侧相当于减去w,j+w->j)
![[砝码称重.png]]
代码:
(1)法一:好理解

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=105,V=1e5+10;
int n,w[N],dp[N][V];//dp[i][j]表示到第i个砝码为止,到重量j为止,是否可以称出来,为0/1 int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;ll sum=0;for(int i=1;i<=n;i++){cin>>w[i];sum+=w[i];}for(int i=1;i<=n;i++){for(int j=1;j<=sum;j++){ //最大重量到sum //1.好理解的//先从前i-1个砝码状态转移过来dp[i][j]=dp[i-1][j];//如果上一个状态称不出来重量j,看看有了第i个砝码能不能称出重量jif(dp[i][j]==0){//当前砝码就是重量jif(w[i]==j)	dp[i][j]=1;//重量j+w[i]能称出来,当前砝码放另一侧,减去w[i],j+w[i]->j if(dp[i-1][j+w[i]])	dp[i][j]=1;//重量abs(j-w[i])能称出来,当前砝码放同侧,加上w,abs(j-w[i])->j //取abs是因为不确定对于自己这一侧来看重量是正是负(自己这一侧为正值)if(dp[i-1][abs(j-w[i])])	dp[i][j]=1; } }} ll ans=0;for(int j=1;j<=sum;j++){if(dp[n][j]==1)	ans++;}cout<<ans;return 0;
}

(2)法二:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=105,V=1e5+10;
int n,w[N],dp[N][V];//dp[i][j]表示到第i个砝码为止,到重量j为止,是否可以称出来,为0/1 int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;ll sum=0;for(int i=1;i<=n;i++){cin>>w[i];sum+=w[i];}dp[0][0]=1; //保证当前砝码就是重量j的情况for(int i=1;i<=n;i++){for(int j=0;j<=sum;j++){ //从0开始,最大重量到sum //2.三种状态转移而来,且dp[i][j]值为0或1,用或操作dp[i][j]=dp[i-1][j]||dp[i-1][j+w[i]]||dp[i-1][abs(j-w[i])];}} ll ans=0;for(int j=1;j<=sum;j++){ //从1开始if(dp[n][j]==1)	ans++;}cout<<ans;return 0;
}

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

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

相关文章

MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!

目录 一、什么是 MyBatis-Plus 自动填充&#xff1f; &#x1f914;二、自动填充的原理 ⚙️三、实际例子&#xff1a;创建时间和更新时间字段自动填充 ⏰四、注意事项 ⚠️五、总结 &#x1f389; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…

arduino R4 SD卡读写测试

使用买来的 st7789LCD 显示器背面就带着一个 tf 卡槽&#xff0c;可以直接连接 tf 卡。使用 Sdfat 库就可以实现对 sd 卡的读写操作。这里尝试测试 sd 卡的读写功能。 LCD 显示器的初始化 //定义LCD的对象 Adafruit_ST7789 tft Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);tf…

【武汉·4月11日】Parasoft联合光庭信息研讨会|邀您共探AI赋能新机遇

Parasoft联合光庭信息Workshop邀您共探AI赋能新机遇 AI浪潮已至&#xff0c;你准备好了吗&#xff1f; 在智能网联汽车飞速发展的今天&#xff0c;AI技术正以前所未有的速度重塑行业生态。如何把握AI机遇&#xff0c;赋能企业创新&#xff1f; 4月11日&#xff0c;自动化软件…

防火墙带宽管理

拓扑 配置 [fw]interface GigabitEthernet 0/0/0 [fw-GigabitEthernet0/0/0]service-manage all permit [fw]interface GigabitEthernet 1/0/0 [fw-GigabitEthernet1/0/0]ip address 12.0.0.1 24 [fw]interface GigabitEthernet 1/0/1 [fw-GigabitEthernet1/0/1]ip ad…

一人系统 之 为什么要做一人系统?

一人系统 之 赚钱认知篇&#xff08;下&#xff09; 本文 2119个字&#xff0c;大概阅读时间 16分钟。 在上一篇文章中&#xff0c;主要讲了以下三个内容&#xff1a; 什么是好的工作&#xff1f;时薪高&#xff0c;并且有能力提升&#xff0c;而且最终可以独立创业的工作&…

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及&#xff0c;势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营&#xff0c;互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容&#xff0c;再加上电影行业的发展&#xff0c;如此繁荣吸引…

Java安全-类的动态加载

类的加载过程 先在方法区找class信息&#xff0c;有的话直接调用&#xff0c;没有的话则使用类加载器加载到方法区(静态成员放在静态区&#xff0c;非静态成功放在非静态区)&#xff0c;静态代码块在类加载时自动执行代码&#xff0c;非静态的不执行;先父类后子类&#xff0c;…

ROS多机通信功能包——Multibotnet

引言 这是之前看到一位大佬做的集群通信中间件&#xff0c;突发奇想&#xff0c;自己也来做一个&#xff0c;实现更多的功能、更清楚的架构和性能更加高效的ROS多机通信的功能包 链接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

C++:背包问题习题

1. 货币系统 1371. 货币系统 - AcWing题库 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每种货币使用的次数不限。 不同种类的货币&#xff0c;面值可能是相同的。 现在&#xff0c;要你用这 V 种货币凑出 N 元钱&#xff0c;请问共有多少种不同的…

IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js

P(rocess)M(anager)2 是一个 node.js 下的进程管理器&#xff0c;内置负载均衡&#xff0c;支持应用自动重启&#xff0c;常用于生产环境运行 node.js 应用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2发布最新版本v6.0.5&#xff0c;这…

【数据分享】2014-2024年我国各城市逐年空气质量指数(AQI)数据

空气质量指数&#xff08;AQI&#xff09;是一个衡量空气污染程度的综合指标&#xff0c;它并不直接表示具体污染物的浓度值&#xff0c;而是基于多种污染物的浓度进行的综合评价&#xff0c;具体基于六种主要污染物的浓度&#xff1a;PM2.5、PM10、SO₂、NO₂、O₃和CO。AQI是…

【C++】深入理解list迭代器的设计与实现

深入理解list迭代器的设计与实现 引言1、链表基础结构2、链表迭代器的封装2.1 初步封装迭代器类2.2 引入const迭代器2.2.1 参考STL源代码2.2.2 完善迭代器 3、迭代器实现机制结语 引言 在STL容器中&#xff0c;list作为经典的双向链表容器&#xff0c;其迭代器设计体现了C模板编…

磁盘清理工具-TreeSize Free介绍

TreeSizeFree是一个磁盘空间管理工具&#xff0c;主要用于分析磁盘使用情况&#xff0c;帮助用户找到占用空间大的文件和文件夹: 特点&#xff1a;按大小排序&#xff1a;快速找到占用空间最大的文件或文件夹 一般可以删除: 扫描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距离公式

一、各类距离公式总结 常见距离公式 欧氏距离&#xff1a; 曼哈顿距离&#xff08;L1&#xff09;‌&#xff1a; 切比雪夫距离&#xff08;Chessboard&#xff09;‌&#xff1a; 1、点与点距离(欧氏距离) ‌二维空间‌ 设两点坐标为 P1(x1,y1)、P2(x2,y2)&#xff0c;其距离…

Vue.js 模板语法全解析:从基础到实战应用

引言 在 Vue.js 的开发体系中&#xff0c;模板语法是构建用户界面的核心要素&#xff0c;它让开发者能够高效地将数据与 DOM 进行绑定&#xff0c;实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节&#xff08;实际围绕 Vue 模板语法展开&#xff09;…

论文笔记(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理问答&#xff08;ERQA&#xff09;基准测试2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零样本和少样本机器人控制 3. 使用 Gemini Robotics 执行机器人动作3…

centos7搭建postgresql12主从

主从搭建 192.168.159.101 node1 主库&#xff08;读写&#xff09; 192.168.159.102 node2 备库&#xff08;只读&#xff09; 两台机器首先安装postgrsql 主库 postgres用户操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外…

996引擎-接口测试:背包

996引擎-接口测试:背包 背包测试NPC参考资料背包测试NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");

vulnhub靶场之【hack-me-please靶机】

前言 靶机&#xff1a;billu_b0x2靶机&#xff0c;IP地址为192.168.10.8 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用桥接网卡模式 文章涉及的靶机及工具&#xff0c;都可以自行访问官网或者项目地址进行获取&…

机器学习——KNN模型评价

一、主要函数 sklearn.metrics.accuracy_score() 是 scikit-learn 中用于计算分类模型准确率的函数&#xff0c;适用于评估分类任务的整体性能。 1、核心功能 作用&#xff1a;计算模型预测的准确率&#xff0c;即正确分类的样本数占总样本数的比例。公式&#xff1a;Accurac…