道标 · 年 2021-07-10 15:33 采纳率: 66.7%
浏览 54

山山的投资 c++

山山最近在考虑一个五年投资计划。现在有T(1 <= T <= 10) 家投资公司,每一家都经营n(1 <= n <= 1000)种理财产品,并给出了每一种产品目前的价值ai以及五年后的价值bi(1 <= ai, bi<= 1000)。山山可以从这T家投资公司中选取若干家,并在其中投入一定数量的钱。对于一家投资公司,山山可以购买其中的理财产品,同一公司的每一种产品最多购买一次。五年后山山会将所有的产品全部卖出。
当山山选择一家投资公司时,需要缴纳ki(1 <= ki<=1000)的手续费。注意若山山选择了这一家公司,即使山山不购买任何该公司的理财产品,仍然要缴纳手续费。
现在山山手中金币数为m(1 <= m <= 1000),你需要设计一种方案使得山山能够在五年后获得最大数量的金币。

输入格式:

 第一行三个正整数T, n, m,分别表示投资公司数量,每家公司提供理财产品数量,以及山山现在的金币数。 




 下面一行,包含T个整数ki,表示第i家投资公司的手续费。 




 接下来T行,每行n个数ai,表示现在每一家公司第i个投资产品的价格。 




 之后T行,每行n个数bi,表示五年后每一家公司第i个投资产品的价格。 

输出格式:

输出一行一个整数,表示山山五年后持有的最大金币数。
限制:

空间限制:128MByte
时间限制:1秒
样例:

输入:

2 2 10
1 1
2 3
1 4
1 4
1 6
输出:

11
提示:

山山可以选择两家公司,缴纳2手续费,剩余8金币。山山用3金币购买第一家公司的第二种产品,并用4金币购买第二家公司的第二种产品,剩余1金币。五年后得到4+6金币,共计11金币,为最大值。

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-15 18:18
    关注

    参考GPT和自己的思路:

    这道题可以使用 01 背包的思路求解。假设 dp[i][j] 表示只考虑前 i 家投资公司,花费不超过 j,能够获得的最大金币数。那么有以下状态转移方程:

    当不选择第 i 家公司时:dp[i][j] = dp[i-1][j]

    当选择第 i 家公司时:dp[i][j] = max(dp[i][j], dp[i-1][j-cost[i][k]] + value[i][k])

    其中,cost[i][k] 表示第 i 家公司的第 k 种产品的手续费,value[i][k] 表示第 i 家公司的第 k 种产品五年后能够获得的金币数。

    最终的答案是 dp[T][m],即 T 家投资公司中,花费不超过 m 时所能获取到的最大金币数。

    需要注意的是,在输入阶段,需要同时记录 ai 和 bi 两个数组,这个过程比较麻烦,需要做好数组下标的映射。另外,本题的时间和空间限制都比较友好,就算使用暴力的 01 背包,也可以 AC 本题。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月10日

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!