算法解析

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

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

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

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

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. Hive SQL的底层编译过程详解

    本文结构采用宏观着眼,微观入手,从整体到细节的方式剖析 Hive SQL 底层原理.第一节先介绍 Hive 底层的整体执行流程,然后第二节介绍执行流程中的 SQL 编译成 MapReduce 的过程, ...

  2. python的参数传递是值传递还是引用传递?都不是!

    [写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...

  3. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...

  4. AVL树的插入和删除

    一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...

  5. cf 12C Fruits(贪心【简单数学】)

    题意: m个水果,n个价格.每种水果只有一个价格. 问如果给每种水果分配价格,使得买的m个水果总价格最小.最大. 输出最小值和最大值. 思路: 贪心. 代码: bool cmp(int a,int b ...

  6. 干货分享之spring框架源码分析02-(对象创建or生命周期)

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 之前分析了Spring读取xml文件的所有信息封装成beanDef ...

  7. spark structured-streaming 最全的使用总结

    一.spark structured-streaming  介绍 我们都知道spark streaming  在v2.4.5 之后 就进入了维护阶段,不再有新的大版本出现,而且 spark strea ...

  8. robot_framewok自动化测试--(7)认识RIDE

    认识 RIDE RIDE 作为 Robot Framework 的"脸面",虽然我们已经可以拿它来创建和运行测试了,但我们对它的认识并不全面,这一小节我们将了解这个工具的使用. 1 ...

  9. 用 python 解决线性代数中的矩阵运算

    用 python 解决线性代数中的矩阵运算 矩阵叉乘 矩阵求逆 矩阵转置 假定AX=B,求解未知矩阵X 矩阵的行列式值|matrix| 未完待续..... import sys from PyQt5. ...

  10. mybatis-plus查询指定字段

    show me the code :mybais-plus版本:3.1.1 1,排除某些字段,可以同时排除多个字段排除多个字段写法: .setEntity(new User()) .select(c ...