虚拟游戏理财【华为OD机试-JAVAPythonC++JS】

题目描述

题目描述:
在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N(元)进行投资,能接受的总风险值为X。
你要在可接受范围内选择最优的投资方式获得最大回报。
说明:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额回报率=投资回报
输入描述:
第一行:产品数(取值范围[1, 20]),总投资额(整数,取值范围[1, 10000]),可接受的总风险(整数,取值范围[1, 200])
第二行:产品投资回报率序列,输入为整数,取值范围[1,60]
第三行:产品风险值序列,输入为整数,取值范围[1,100]
第四行:最大投资额度序列,输入为整数,取值范围[1,10000]
输出描述:
每个产品的投资额序列
补充说明:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额
回报率=投资回报
示例1
输入:
5 100 10
10 20 30 40 50
3 4 5 6 10
20 30 20 40 30
输出:
0 30 0 40 0
说明:
投资第二项30个单位,第四项40个单位,总的投资风险为两项相加为4+6=10

解题思路

  1. 输入处理: 读取输入,获取产品数、总投资额、可接受的总风险值以及各项指标的序列。

  2. 动态规划定义: 定义一个二维数组dp,其中dp[i][j]表示在前i个产品中选择不超过j总投资额的情况下,能够达到的最小总风险值。

  3. 状态转移方程: 对于第i个产品,有两个选择:不投资或者投资。若选择不投资,则dp[i][j] = dp[i-1][j];若选择投资,则dp[i][j] = dp[i-1][j-investment[i]] + risk[i],其中investment[i]为第i个产品的投资额,risk[i]为第i个产品的风险值。

  4. 递推填表:i=1n,从j=0total_investment,根据状态转移方程填充动态规划表。

  5. 构建最优解: 从填充好的动态规划表中反向追溯,得到最优解,即投资额序列。

  6. 输出结果: 输出每个产品的投资额序列。

这样的动态规划方法能够有效地找到在总投资额和总风险值限制下,获取最大回报的投资方式。

题解代码

理解你的需求,我会为Python、Java、C/C++和JavaScript分别提供相应的题解代码。

Python题解代码

number, N, X = map(int, input().split())
return_list = list(map(int, input().split()))
risk_list = list(map(int, input().split()))
max_cost_list = list(map(int, input().split()))return_list.append(0)
risk_list.append(0)
max_cost_list.append(0)
number += 1max_return = 0
max_status = ["0"] * number
max_return_risk = 0for i in range(number):for j in range(i + 1, number):if risk_list[i] + risk_list[j] <= X:max_return_product_index = i if return_list[i] > return_list[j] else jother_return_product_index = i + j - max_return_product_indexmax_return_cost = min(N, max_cost_list[max_return_product_index])other_return_cost = min(N - max_return_cost, max_cost_list[other_return_product_index])cur_return = (return_list[max_return_product_index] * max_return_cost+ return_list[other_return_product_index] * other_return_cost)if cur_return > max_return:max_return = cur_returnmax_return_risk = risk_list[i] + risk_list[j]max_dict = {max_return_product_index: max_return_cost,other_return_product_index: other_return_cost,}for k in range(number):max_status[k] = str(max_dict.get(k, 0))
print(" ".join(max_status[:-1]))

Java题解代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int number = scanner.nextInt();int N = scanner.nextInt();int X = scanner.nextInt();int[] returnList = new int[number];int[] riskList = new int[number];int[] maxCostList = new int[number];for (int i = 0; i < number; i++) {returnList[i] = scanner.nextInt();}for (int i = 0; i < number; i++) {riskList[i] = scanner.nextInt();}for (int i = 0; i < number; i++) {maxCostList[i] = scanner.nextInt();}int[] maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);for (int i = 0; i < number; i++) {System.out.print(maxReturnStatus[i] + " ");}}private static int[] getMaxReturnStatus(int number, int N, int X, int[] returnList, int[] riskList, int[] maxCostList) {number++;int[] returnListExtended = new int[number];int[] riskListExtended = new int[number];int[] maxCostListExtended = new int[number];System.arraycopy(returnList, 0, returnListExtended, 0, returnList.length);System.arraycopy(riskList, 0, riskListExtended, 0, riskList.length);System.arraycopy(maxCostList, 0, maxCostListExtended, 0, maxCostList.length);returnListExtended[number - 1] = 0;riskListExtended[number - 1] = 0;maxCostListExtended[number - 1] = 0;int maxReturn = 0;int maxReturnRisk = 0;int[] maxStatus = new int[number];for (int i = 0; i < number; i++) {for (int j = i + 1; j < number; j++) {if (riskListExtended[i] + riskListExtended[j] <= X) {int maxReturnProductIndex = (returnListExtended[i] > returnListExtended[j]) ? i : j;int otherReturnProductIndex = i + j - maxReturnProductIndex;int maxReturnCost = Math.min(N, maxCostListExtended[maxReturnProductIndex]);int otherReturnCost = Math.min(N - maxReturnCost, maxCostListExtended[otherReturnProductIndex]);int curReturn = returnListExtended[maxReturnProductIndex] * maxReturnCost+ returnListExtended[otherReturnProductIndex] * otherReturnCost;if (curReturn > maxReturn) {maxReturn = curReturn;maxReturnRisk = riskListExtended[i] + riskListExtended[j];for (int k = 0; k < number; k++) {maxStatus[k] = (k == maxReturnProductIndex) ? maxReturnCost: (k == otherReturnProductIndex) ? otherReturnCost : 0;}}}}}return maxStatus;}
}

C/C++题解代码

#include <iostream>
#include <vector>using namespace std;vector<int> getMaxReturnStatus(int number, int N, int X, vector<int> returnList, vector<int> riskList, vector<int> maxCostList) {number++;returnList.push_back(0);riskList.push_back(0);maxCostList.push_back(0);int maxReturn = 0;int maxReturnRisk = 0;vector<int> maxStatus(number, 0);for (int i = 0; i < number; i++) {for (int j = i + 1; j < number; j++) {if (riskList[i] + riskList[j] <= X) {int maxReturnProductIndex = (returnList[i] > returnList[j]) ? i : j;int otherReturnProductIndex = i + j - maxReturnProductIndex;int maxReturnCost = min(N, maxCostList[maxReturnProductIndex]);int otherReturnCost = min(N - maxReturnCost, maxCostList[otherReturnProductIndex]);int curReturn = returnList[maxReturnProductIndex] * maxReturnCost+ returnList[otherReturnProductIndex] * otherReturnCost;if (curReturn > maxReturn) {maxReturn = curReturn;maxReturnRisk = riskList[i] + riskList[j];fill(maxStatus.begin(), maxStatus.end(), 0);maxStatus[maxReturnProductIndex] = maxReturnCost;maxStatus[otherReturnProductIndex] = otherReturnCost;}}}}return maxStatus;
}int main() {int number, N, X;cin >> number >> N >> X;vector<int> returnList(number);vector<int> riskList(number);vector<int> maxCostList(number);for (int i = 0; i < number; i++) {cin >> returnList[i];}for (int i = 0; i < number; i++) {cin >> riskList[i];}for (int i = 0; i < number; i++) {cin >> maxCostList[i];}vector<int> maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);for (int i = 0; i < number; i++) {cout << maxReturnStatus[i] << " ";}return 0;
}

JavaScript题解代码

function getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList) {number++;returnList.push(0);riskList.push(0);maxCostList.push(0);let maxReturn = 0;let maxReturnRisk = 0;const maxStatus = new Array(number).fill(0);for (let i = 0; i < number; i++) {for (let j = i + 1; j < number; j++) {if (riskList[i] + riskList[j] <= X) {const maxReturnProductIndex = (returnList[i] > returnList[j]) ? i : j;const otherReturnProductIndex = i + j - maxReturnProductIndex;const maxReturnCost = Math.min(N, maxCostList[maxReturnProductIndex]);const otherReturnCost = Math.min(N - maxReturnCost, maxCostList[otherReturnProductIndex]);const curReturn = returnList[maxReturnProductIndex] * maxReturnCost+ returnList[otherReturnProductIndex] * otherReturnCost;if (curReturn > maxReturn) {maxReturn = curReturn;maxReturnRisk = riskList[i] + riskList[j];maxStatus.fill(0);maxStatus[maxReturnProductIndex] = maxReturnCost;maxStatus[otherReturnProductIndex] = otherReturnCost;}}}}return maxStatus;
}const readline = require('readline');
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});rl.question('', (input) => {const inputs = input.split(' ');const number = parseInt(inputs[0]);const N = parseInt(inputs[1]);const X = parseInt(inputs[2]);rl.question('', (input) => {const returnList = input.split(' ').map(Number);rl.question('', (input) => {const riskList = input.split(' ').map(Number);rl.question('', (input) => {const maxCostList = input.split(' ').map(Number);const maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);console.log(maxReturnStatus.join(' '));rl.close();});});});
});

代码OJ评判结果

通过测试点

代码讲解

Python题解代码讲解

  1. 输入处理: 通过input()读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 遍历组合: 使用两层循环遍历所有产品组合,计算它们的总风险和是否符合可接受风险。

  4. 判断最大回报: 对于符合条件的组合,计算它们的回报,并比较是否超过之前的最大回报。若是,则更新最大回报及相应的投资组合。

  5. 输出结果: 输出得到的最优投资组合的投资额序列。

Java题解代码讲解

  1. 输入处理: 使用Scanner读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

C/C++题解代码讲解

  1. 输入处理: 使用cin读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

JavaScript题解代码讲解

  1. 输入处理: 使用Node.js的readline模块逐行读取输入,获取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

寄语

🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻

在这里插入图片描述

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

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

相关文章

理解计算着色器中glsl语言的内置变量

概要 本文通过示例的方式&#xff0c;着重解释以下几个内置变量&#xff1a; gl_WorkGroupSizegl_NumWorkGroupsgl_LocalInvocationIDgl_WorkGroupIDgl_GlobalInvocationID 基本概念 局部工作组与工作项 一个3x2x1的局部工作组示例如下&#xff0c;每个小篮格子表示一个工作项…

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…

vue实现自定义树形穿梭框功能

需求&#xff1a; 我们在开发过程中&#xff0c;会遇到需要将一个数据选择做成穿梭框&#xff0c;但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示&#xff0c;ElementUI自身无法在穿梭框中添加树形结构&#xff0c;网上搜到了大佬封装的插件但是对于右侧的无树形结…

pix2pix-zero

pix2pix-zero&#xff1a;零样本图像到图像转换 论文介绍 Zero-shot Image-to-Image Translation 关注微信公众号: DeepGoAI 项目地址&#xff1a;https://github.com/pix2pixzero/pix2pix-zero 论文地址&#xff1a;https://arxiv.org/abs/2302.03027 本文介绍了一种名为…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题&#xff0c;如果我没有理解错的话&#xff0c;应该就是前后同时传递文件数据 非文件数据&#xff0c;前后端数据该如何接收&#xff0c;这里我给出我自己的解决方案 tip:下文在编写前端代码的时候&#xff0c;用到了这篇…

NPN型三极管与PNP型三极管基本原理

NPN型三极管与PNP型三极管基本原理 文章目录 NPN型三极管与PNP型三极管基本原理一、三极管二、结构三、工作原理四、基本应用五、总计 一、三极管 三极管是电子电路中最基本、最常见、重要的器件&#xff0c;其主要功能是对电流的放大和开关作用&#xff0c;从半导体结构上可以…

鸿蒙开发相关知识(三)【路由、显示动画、属性动画、组件内转场动画、http数据请求、第三方库axios、页面和自定义组件生命周期】

文章目录 一、路由1、清空页面栈2、路由跳转模式3、跳转到应用内的指定页面4、某个页面替换当前页面5、返回上一页面或指定的页面6、获取路由参数7、开启页面返回询问对话框8、导入路由模块9、页面路径配置10、完整示例 二、属性动画和显式动画1、属性动画2、显示动画3、组件内…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码&#xff0c;但是我在第一步就被卡住无法更改密码&#xff0c;输入指令也报错&#xff0c;检查的环境变量也没错&#xff0c;经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

(详解)python调用另一个.py文件中的类和函数或直接运行另一个.py文件

一、同一文件夹下的调用 1.调用函数 A.py文件如下&#xff1a; def add(x,y):print(和为&#xff1a;%d%(xy))在B.py文件中调用A.py的add函数如下&#xff1a; import A A.add(1,2)或 from A import add add(1,2)2.调用类 A.py文件如下&#xff1a; class Add:def __ini…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

VUE-npm ERR! C:\rj\node-v14.4.0-win-x64\nod

错误 解决办法 node -v 查看版本 npm config set registry https://registry.npmmirror.com 设置下载源 npm config get registry 获取下载源

第三个实验,三个浮点数的运算

两个浮点数相加 得到的结果再和第三个数相减 最后显示计算结果 第一步&#xff1a;新建项目 第二步&#xff1a;添加运算部件 第四步&#xff1a;添加浮点数值部件 第五步&#xff1a;修改数值部件类型 第六步&#xff1a;在前面板添加输出结果显示部件 第七步&#xff1a;连…