实现的动态规划问题华为笔试题C++实现

2024-09-08 05:20

本文主要是介绍实现的动态规划问题华为笔试题C++实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结

动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解;

动态规划中开始介绍的爬楼梯等问题,答案中会出现递归的方法,这让我一开始以为所谓的动态规划和递归都是从相求的结果开始,采用递归的方法;但是后来我看到剑指offer中说到,从最初的状态对结果进行求解才会避免多余的计算方式,因此出现这样一道题:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。

对于求解的amount整数,可以求amount-coins[idx]最小,最终一步步递归求解,也可以用循环的方式从amount等于0一直求解到等于amount;

其次是华为秋招面试的一道动态规划的题,我大概描述一下我自己的想法:

        维修工要给n个客户更换设备,为每个用户更换一个设备。维修工背包内最多装k个设备,如果背包里有设备可以直接前往下一个客户更换或回公司补充设备,没有则需要回公司取设备。这些客户有优先级,维修工需要按照优先级给客户更换设备,优先级level用数字表示,数字小的优先级高。维修工从公司出发,给n个客户更换设备,最后再返回公司。请计算维修工完成这项工作所需要经历的最短总距离是多少。维修工可以走斜线。

  我在其中最大的问题就是,每个节点都可以回去,而且在某个节点回去之后都有可能导致最后的总的长度要小于在身上背的用完的时候大,然后我就纠结在一点很久,然后想了很久其实就是维修工再去找另一个用户到底会不会公司补充工具的问题,我过于纠结装备用不用完而不是选择上的问题,这就是我不会做动态规划问题的根本原因,我在对问题抽象的时候,经常把应该抽象在问题中的一个选择分支想做两个问题;下面我给出这一题我自己写的C++的答案,不一定对,只是自己的理解而已;

#include <iostream>
#include <cstdlib>  
#include <map>  
#include <vector>  
#include <string>  
#include <algorithm> 
#include <deque>  using namespace std;struct MyStruct
{int x;int y;int iLevel;
};struct MyStructState
{int idx;int volume;bool operator ==(const MyStructState& a){if (this->idx == a.idx && this->volume == a.volume)return true;return false;}};bool GreaterSort( MyStruct a,  MyStruct b)  // 重载sort函数的自定义比较函数comp
{return (a.iLevel < b.iLevel);}//map<int,map<int, double>>dp;
map<pair<int,int>,double>dp;
//map<MyStructState, double>dp;
vector<MyStruct> userInfoVec;
MyStruct comLocal;int sceneInfo[2];double calDis(MyStruct point1, MyStruct point2) {double distance= sqrt((point2.x - point1.x) * (point2.x - point1.x) + (point2.y- point1.y) * (point2.y - point1.y));return distance;
}double dfs(int idx,int volume,int userNums) {double temp;double distance;//if (dp.find(idx) != dp.end() && dp[idx].find(volume) != dp[idx].end())//	//	if (dp[{idx, volume}])return dp[{idx, volume}];distance = calDis(userInfoVec[idx], comLocal);if (idx == userNums - 1)return distance;temp = dfs(idx + 1, sceneInfo[1] - 1, sceneInfo[0]) + distance + calDis(comLocal, userInfoVec[idx + 1]);if (volume > 0)temp = min(temp, dfs(idx + 1, volume - 1, sceneInfo[0]) + calDis(userInfoVec[idx], userInfoVec[idx + 1]));dp[{idx, volume}] = temp;return temp;
}using namespace std;
int main() {MyStruct temp;//vector<MyStruct> userInfoVec;for (int i = 0; i < 2; i++) {cin >> sceneInfo[i];}cin >> comLocal.x;cin >> comLocal.y;int ilevel;for (int i = 0; i < sceneInfo[0]; i++) {cin >> temp.x;cin >> temp.y;cin >> temp.iLevel;userInfoVec.push_back(temp);}std::sort(userInfoVec.begin(), userInfoVec.end(), GreaterSort);printf("%f\n",( dfs(0,sceneInfo[1], sceneInfo[0]) + calDis(comLocal, userInfoVec[0])));}

这篇关于实现的动态规划问题华为笔试题C++实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147232

相关文章

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red