关于DP与背包

听说过动态规划(DP)的同学应该都知道有背包问题的存在。

首先我们来了解一下动态规划

基本思想:

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解。没一个解都对应于一个值,我们希望找到具有最优值的解。胎动规划算法与分治法类似,其基本思想也是将待求解问题分解为若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算很多次。如果我们能保存已解决子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划算法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

与分治法最大的差别是:适用于动态规划求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)

应用场景:

适用于动态规划的问题必须满足最优化原理、无后效性和重叠性。

(1) 最优化原理(最优子结构性质):一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。

(2) 无后效性:将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称无后效性。

(3) 子问题的重叠性:动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这就是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他算法。

接下来,看背包问题,嗯,听起来就很朴素。

其实背包问题也很简单,无非就是在容器一定的情况下,往里面塞东西,但是容器的容量有限,总不能把它撑爆吧,那不就弄巧成拙了,所以我们要把利益和效率最大化。在容器容量一定的情况下,根据物体的体积(质量)等条件来判断如何装才能使容器内所存物体的价值最大。这就用到了背包问题。

首先我们来看的是01背包问题

01背包指在容器容量一定下,每种物品只有一个,告诉你他们的体积(或者其它条件),以及价值,来使价值最大化。

代码:(优化后为二重循环)

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int total_weight,wp_weight,every_jz;
int main() {cin>>total_weight;int dp[total_weight];memset(dp,0,sizeof(dp));cin>>wp_weight;int w[wp_weight],v[wp_weight];for(int i=1;i<=wp_weight;i++)cin>>w[i];for(int i=1;i<=wp_weight;i++)cin>>v[i];for (int i = 1; i <= wp_weight; i++)for (int j = total_weight; j >=w[i] ; j--)dp[j] = max(dp[j], dp[j - w[i]] + v[i]);cout << "总的价值为: " << dp[total_weight] << endl;return 0;
}
View Code

进一步的,我们再来看一下完全背包问题

完全背包指在容器容量一定下,每种物品有无数件,告诉你他们每种分别的体积(或者其它条件),价值,力求价值最大化。

代码:(优化后为二重循环)

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int total_weight,wp_weight,every_jz;
int main() {cin>>total_weight;int dp[total_weight];memset(dp,0,sizeof(dp));cin>>wp_weight;int w[wp_weight],v[wp_weight];for(int i=1;i<=wp_weight;i++)cin>>w[i];for(int i=1;i<=wp_weight;i++)cin>>v[i];for (int i = 1; i <= wp_weight; i++)for (int j = w[i]; j <=total_weight ; j++)dp[j] = max(dp[j], dp[j - w[i]] + v[i]);cout << "总的价值为: " << dp[total_weight] << endl;return 0;
}
View Code

最后我们来看一下多重背包问题

即容器容量一定下,每种物品有固定件数,告诉你他们每种分别的体积(或者其它条件),价值,自然还是令价值最大化。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int total_weight,w_weight;
int main() {cin>>total_weight>>w_weight;int w[w_weight],v[w_weight],cot[w_weight],dp[total_weight+1];memset(dp,0,sizeof(dp));for (int i = 1; i <= w_weight; i++)for (int k = 1; k <= cot[i]; k++)for (int j = total_weight; j >= w[i]; j--)dp[j] = max(dp[j], dp[j - w[i]] + v[i]);cout << "总的价值为: " << dp[total_weight] << endl;return 0;
}
View Code

别丧气,你现在只是单身了十几年,以后,你还会单身好久呢。

转载于:https://www.cnblogs.com/GTBD/p/9215470.html

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

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

相关文章

MATLAB图像中添加标记

指定坐标添加标记: text(x,y,str)手动指定位置添加标记: gtext(str)横纵坐标xlabel()%横ylabel()%纵tittle()%标题

QQ空间说说的表情添加的代码

QQ空间说说的表情添加的代码 [em]e100[/em] 微笑 [em]e101[/em] 撇嘴[em]e102[/em] 色[em]e103[/em] 发呆[em]e104[/em] 得意[em]e105[/em] 流泪[em]e106[/em] 害羞[em]e107[/em] 闭嘴[em]e108[/em] 睡[em]e109[/em] 大哭[em]e110[/em] 尴尬[em]e111[/…

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第3部分

在之前的博客中&#xff0c;我们使用Thymeleaf&#xff0c;Bower和Bootstrap构建了登录页面&#xff0c;并将其部署到了Heroku。 在此博客中&#xff0c;我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…

Nginx配置安装

安装之前准备1、依赖 gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel -y 安装Nginx./configure make && make install 默认安装目录&#xff1a;/usr/local/nginx 配置Nginx为系统服务&#xff0c;以…

matlab自定义窗口名

fg1figure(numbertitle,off,name,标题名称,color,white);saveas(fg1,保存图形的名称);clruprop 清除用户自定义属性setuprop 设置用户自定义属性getuprop 获取用户自定义属性

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇&#xff1a;利用SqlSugar快速实现CRUD 3.3 生成实体类 四. 集成JWT授权验证 本来打算将搭建项目架构和集成SqlSugar放在一起讲的&…

zk 布局_ZK实际应用:样式和布局

zk 布局在先前的ZK in Action帖子中&#xff0c;我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码&#xff0c;可能需要更多的解释。 在本文中&#xff0c;我们将介绍如何在ZK小部件上附加新CSS样式规则&#xff0c;以及如何覆盖现有样式。 我们还将介绍ZK中UI布…

蓝桥杯 2011年第二届C语言初赛试题(2)

6. 代码填空 &#xff08;满分9分&#xff09; 中奖计算 某抽奖活动的规则是&#xff1a;每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同&#xff0c;则称为中了几个号。 例如&…

MATLAB离散一维小波函数

waveinfowfilters(wname);appcoef近似系数 detcoef详细系数dwt 单层独立1-D小波idwtupcoef 线性重建upwlev 单层重建wavedec wavelet decompositionwaverecwrcoef

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分

在这一系列博客文章中&#xff0c;我们将使用以下技术堆栈构建完整的响应式Web应用程序&#xff1a; 1&#xff09;弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2&#xff09;Thymeleaf用于服务器端模板 3&#xff09;客户端MVC的Angular JS&#xff08;包括…

Codeforces 999F Cards and Joy 【dp】【性质】

读完这道题后应该想到牌有多少张都是什么不重要&#xff0c;重要的是player的favorite number是怎么分配的。&#xff08;因为不是任何player的favorite number不能带来任何joy&#xff09;然后每个favorite number带来的joy互相不受影响&#xff0c;因为如果favorite number不…

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;Y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的X&#xff0c;半分钟之后吃掉1个Y&#xff0c;并且&#xff0c;从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算&#xff08;求离散点的边界&#xff09; [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…

父组件 子组件渲染

子组件使用v-if判断后渲染。 v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。 转载于:https://www.cnblogs.com/mengfangui/p/9228137.html

介绍Spring Integration

在本文中&#xff0c;我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration&#xff0c;那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之&#xff0c; 企业…

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪&#xff1a; 每位选手需要回答10个问题&#xff08;其编号为1到10&#xff09;&#xff0c;越后面越有难度。答对的&#xff0c;当前分数翻倍&#xff1b;答错了则扣掉与题号相同的分数&#xff08;选手必须回答…

各种资源(持续更新中)

寻找网页设计灵感的27个最佳网站推荐http://www.cnblogs.com/lhb25/archive/2011/04/19/2014303.html 模板王http://www.mobanwang.com/ http://sc.chinaz.com/

Katy Perry - E.T.

作曲 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman 作词 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman Youre so hypnotizing // hypnotize /ˈhipnəˌtīz / v.催眠,捕捉全部注意力,吸引 Could you be the devil? 你可会是那魔鬼&#xf…

使用Gradle禁止Java和Spring Boot Web应用程序中的FindBugs警告

如何在 Spring Boot和 Java应用程序中使用注释抑制FindBugs警告 如果您的构建由于FindBugs问题而中断&#xff0c;并且是假阳性&#xff0c;或者由于其他考虑而无法解决问题&#xff0c;则可以添加注释来忽略Findbugs警告。 更新您的Gradle依赖关系 您将需要在build.gradle文…