在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。
现有一家Bank,它提供有若干理财产品 m 个,风险及投资回报不同,你有 N(元)进行投资,能接收的总风险值为X。
你要在可接受范围内选择最优的投资方式获得最大回报。
备注:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额*回报率=投资回报
输入描述
第一行:
产品数(取值范围[1,20])
总投资额(整数,取值范围[1, 10000])
可接受的总风险(整数,取值范围[1,200])
第二行:产品投资回报率序列,输入为整数,取值范围[1,60]
第三行:产品风险值序列,输入为整数,取值范围[1, 100]
第四行:最大投资额度序列,输入为整数,取值范围[1, 10000]
输出描述
每个产品的投资额序列
用例
输入 | 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 |
题目最重要的限制是最多只能投资两个理财产品。这意味着我们只需要考虑三种情况:
由于产品数量 m ≤ 20,我们可以使用双重循环:
单独投资每个产品
组合投资每对产品
选择最佳方案
m, N, X = map(int, input().split())
rates = list(map(int, input().split()))
risks = list(map(int, input().split()))
max_invest = list(map(int, input().split()))
best_return = 0
best_allocation = [0] * m # 初始全零方案
for i in range(m):
if risks[i] <= X: # 风险可接受
# 计算实际投资额(不超过产品额度和总投资额)
invest = min(max_invest[i], N)
# 计算总回报
total_return = invest * rates[i]
# 更新最佳方案
if total_return > best_return:
best_return = total_return
best_allocation = [0] * m
best_allocation[i] = invest
for i in range(m):
for j in range(i + 1, m):
# 检查风险是否可接受
if risks[i] + risks[j] <= X:
# 确定投资优先级(回报率高的优先)
if rates[i] >= rates[j]:
# 优先投资i产品
invest_i = min(max_invest[i], N)
invest_j = min(max_invest[j], N - invest_i)
else:
# 优先投资j产品
invest_j = min(max_invest[j], N)
invest_i = min(max_invest[i], N - invest_j)
# 计算总回报
total_return = invest_i * rates[i] + invest_j * rates[j]
# 更新最佳方案
if total_return > best_return:
best_return = total_return
best_allocation = [0] * m
best_allocation[i] = invest_i
best_allocation[j] = invest_j
print(" ".join(map(str, best_allocation)))
# 输入处理
m, N, X = map(int, input().split())
rates = list(map(int, input().split()))
risks = list(map(int, input().split()))
max_invest = list(map(int, input().split()))
# 初始化最佳方案
best_return = 0
best_allocation = [0] * m
# 方案1:单独投资每个产品
for i in range(m):
if risks[i] <= X: # 风险可接受
invest = min(max_invest[i], N)
total_return = invest * rates[i]
if total_return > best_return:
best_return = total_return
best_allocation = [0] * m
best_allocation[i] = invest
# 方案2:组合投资每对产品
for i in range(m):
for j in range(i + 1, m):
if risks[i] + risks[j] <= X: # 风险可接受
# 确定投资优先级
if rates[i] >= rates[j]:
invest_i = min(max_invest[i], N)
invest_j = min(max_invest[j], N - invest_i)
else:
invest_j = min(max_invest[j], N)
invest_i = min(max_invest[i], N - invest_j)
total_return = invest_i * rates[i] + invest_j * rates[j]
if total_return > best_return:
best_return = total_return
best_allocation = [0] * m
best_allocation[i] = invest_i
best_allocation[j] = invest_j
# 输出结果
print(" ".join(map(str, best_allocation)))
用例:输入 5 100 10
产品回报率:10 20 30 40 50
产品风险值:3 4 5 6 10
产品额度:20 30 20 40 30
处理过程:
单独投资方案:
组合投资方案:
输出:0 30 0 40 0
这道题展示了问题分析和约束利用的重要性:
双重循环解法的时间复杂度是 O(m²),在 m≤20 时完全可行。核心思想是: