算法解析

动态规划问题满足三大重要性质

最优子结构性质:如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

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

P1759 通天之潜水

题目

在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前。河面上并没有船,但好在小A有\(n\)个潜水工具。由于他还要背重重的背包,所以他只能背\(m\)重的工具,又因为他的力气并不是无限的,河却很宽,所以他只能背有\(v\)阻力的工具。但是这条河下有非常重要的数据,所以他希望能够停留的时间最久。于是他找到了你,让你告诉他方案。

输入

三个数\(m,v,n\)如题目所说

接下来n行,每行三个数\(ai,bi,ci\)分别表示所含的重力,阻力,能够支撑的时间

输出

第一行一个数,表示最长的时间

接下来一行,若干个数,表示所选的物品

样例

100 100 3                                       405
50 60 289 1 2
40 10 116
50 50 106

解析

刚开始看的时候还行,看到要输出所选的物品的时候呆了,想到两种方法

\(First\)是用f[i][j]算最大时间,用三维数组p[i][j][k]表示 第\(i\)个物品在有\(j\)重力\(k\)阻力时是否选这个工具,顺着数组递归输出选的工具

\(Second\)是用DFS 应为数据比较小,不用剪枝也可以过

代码

//第一组
#include <bits/stdc++.h>
#define N 10005
using namespace std;
int f[N][N];
int w[N],v[N],t[N];
bool p[105][205][205];
void print(int date,int m,int s){
if (date==1){
if (p[date][m][s]==true)
printf("1 ");
return;
}else if (p[date][m][s]==true){
print(date-1,m-w[date],s-v[date]);
printf("%d ",date);
}else {
print(date-1,m,s);
}return;
}
int main(){
int m,s,n;
scanf("%d%d%d",&m,&s,&n);
f[0][0]=0;
for (int i=1;i<=n;i++){
scanf("%d%d%d",&w[i],&v[i],&t[i]);
}
for (int l=1;l<=n;l++){
for (int i=m;i>=w[l];i--){
for (int j=s;j>=v[l];j--){
if (f[i][j]<f[i-w[l]][j-v[l]]+t[l]){
f[i][j]=f[i-w[l]][j-v[l]]+t[l];
p[l][i][j]=true;
} }
}
}
printf("%d\n",f[m][s]);
print(n,m,s);
return 0;
}

———————————————————————————一点也不美丽的华丽分割线———————————————————————————————

//第二个
#include <bits/stdc++.h>
using namespace std;
int m,v,n,a[105],b[105],c[105];
int ans,r[105],cs[105],cho;
void dfs(int Nans,int date,int m,int v,int h){
if (m<0||v<0)return;
if (Nans>ans){
ans=Nans;cho=h;
for (int i=1;i<=h;i++)
r[i]=cs[i];
}
if (date>n)return;//当date==n+1时r[i]还没有把cs[i]的都记录下来,要等记录完在return,所以放到下面
cs[h+1]=date;
dfs(Nans+c[date],date+1,m-a[date],v-b[date],h+1);
dfs(Nans,date+1,m,v,h);
return;
}
int main(){
scanf("%d%d%d",&m,&v,&n);
for (int i=1;i<=n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
dfs(0,1,m,v,0);
printf("%d\n",ans);
for(int i=1;i<=cho;i++)
printf("%d ",r[i]);
return 0;
}

P1759 通天之潜水(双写法+解析)的更多相关文章

  1. 洛谷 P1759 通天之潜水

    P1759 通天之潜水 19通过 65提交 题目提供者lych 标签动态规划洛谷原创 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 直达通天路·小A历险记第三篇 题目 ...

  2. 洛谷——P1759 通天之潜水

    P1759 通天之潜水   题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具. ...

  3. 洛谷P1759 通天之潜水

    题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具.由于他还要背重重的背包,所以 ...

  4. luogu P1759 通天之潜水

    题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具.由于他还要背重重的背包,所以 ...

  5. P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...

  6. springboot配置双视图解析器

    因项目要求,需要同时支持html和jsp页面,所以在springboot的基础上配置双视图解析器. 重点在于,抛开原来的resources目录结构层,这层只放application.propertie ...

  7. 关于PHP单双引号解析变量的问题

    双引号可以解析变量,单引号不行 $qweqwe = 123; echo "$qweqwe"; 输出123 echo '$qweqqwe'; 输出$qweqwe

  8. Mybatis 条件判断单双引号解析问题

    最近使用 Mybatis 遇到了一个奇怪的问题,前端传了一个数字字符串(type = "1") ,我做了如下判断: <if test=" type == '1' & ...

  9. makefile文件写法解析

    一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...

随机推荐

  1. java实现责任链模式的小demo

    //一个请假请求 public class LeaveRequest { private int leaveDays; private String name; public void leave() ...

  2. vue基本指令与脚手架基本配置

    脚手架(@vue/cli)创建项目启动服务 1.创建项目 vue create 项目名字 2.启动项目 进入项目根目录,运行以下命令 yarn serve 3.脚手架目录代码分析 ├── node_m ...

  3. 爬虫逆向基础,理解 JavaScript 模块化编程 webpack

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 简介 在分析一些站点的 JavaScript 代码时,比较简单的代码,函数通常都是一个一个的,例 ...

  4. Redis 高阶数据类型重温

    今天这个专题接着上一篇 Redis 的基本数据类型 继续讲解剩下的高阶数据类型:BitMap.HyperLogLog 和 GEO hash.这些数据结构的底层也都是基于我们前面说的 5 种 基本类型, ...

  5. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  6. [no_code][Beta]发布声明报告

    $( "#cnblogs_post_body" ).catalog() 软件下载 一个全新的超简易的OCR表单识别工具 轻松拍照,实现手写表格识别 一键打开,支持多种应用打开你的表 ...

  7. [no code][scrum meeting] Alpha 8

    项目 内容 会议时间 2020-04-14 会议主题 API文档第一版交付 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ). ...

  8. 六个好习惯让你的PCB设计更优

    PCB layout工程师每天对着板子成千上万条走线,各种各样的封装,重复着拉线的工作,也许很多人会觉得是很枯燥无聊的工作内容.看似软件操作搬运工,其实设计人员在过程中要在各种设计规则之间做取舍,兼顾 ...

  9. 攻防世界 杂项 12.Training-Stegano-1

    题目描述: 这是我能想到的最基础的图片隐写术.啊这 题目分析: 最初还以为直接右击属性查看呢 然后用notepad++看看,一团乱码,结果在最后发现了passwd, 然后这就是flag:stegano ...

  10. 期望 概率DP

    期望 \(x\) 的期望 \(E(x)\) 表示平均情况下 \(x\) 的值. 令 \(C\) 表示常数, \(X\) 和 \(Y\) 表示两个随机变量. \(E(C)=C\) \(E(C \time ...