#CSPJ2019C. 纪念品 (Souvenir)

纪念品 (Souvenir)

题目描述

小伟突然获得一种超能力,他知道未来 TTNN 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。

每天,小伟可以进行以下两种交易无限次:

  1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
  2. 卖出持有的任意一个纪念品,以当日价格换回金币。

每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。

TT 天之后,小伟的超能力消失。因此他一定会在第 TT 天卖出所有纪念品换回金币。

小伟现在有 MM 枚金币,他想要在超能力消失后拥有尽可能多的金币。

输入格式

第一行包含三个正整数 TT, NN, MM,相邻两数之间以一个空格分开,分别代表未来天数 TT,纪念品数量 NN,小伟现在拥有的金币数量 MM

接下来 TT 行,每行包含 NN 个正整数,相邻两数之间以一个空格分隔。第 ii 行的 NN 个正整数分别为 Pi,1P_{i,1},Pi,2P_{i,2} , ...... , Pi,NP_{i,N}, 其中 Pi,jP_{i,j} 表示第 ii 天第 jj 种纪念品的价格。

输出格式

输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。

6 1 100
50
20
25
20
25
50
305

最佳策略是:

第二天花光所有 100100 枚金币买入 55 个纪念品 11; 第三天卖出 55 个纪念品 11,获得金币 125125 枚; 第四天买入 66 个纪念品 11,剩余 55 枚金币; 第六天必须卖出所有纪念品换回 300300 枚金币,第四天剩余 55 枚金币,共 305305 枚金币。

超能力消失后,小伟最多拥有 305305 枚金币。

3 3 100
10 20 15
15 17 13
15 25 16
217

最佳策略是:

第一天花光所有金币买入 1010 个纪念品 11; 第二天卖出全部纪念品 11 得到 150150 枚金币并买入 88 个纪念品 2211 个纪念品 33,剩余 11 枚金币; 第三天必须卖出所有纪念品换回 216216 枚金币,第二天剩余 11 枚金币,共 217217 枚金币。

超能力消失后,小伟最多拥有 217217 枚金币。

数据范围与提示

对于 10%10\% 的数据,T=1T = 1。 对于 30%30\% 的数据,T4,N4,M100T \le 4, N \le 4, M \le 100,所有价格 10Pi,j100110 \le P_{i,j} \le 1001 。 另有 15%15\% 的数据,T100,N=1T \le 100, N = 1。 另有 15%15\% 的数据,T=2,N100T = 2,N \le 100。 对于 100%100\% 的数据,T100,N100,M103T \le 100, N \le 100, M \le 10^3,所有价格 1Pi,j1041 \le P_{i,j} \le 10^4 ,数据保证任意时刻,小明手上的金币数不可能超过 10410^4

分析

【分析】

这道题已知N件物品未来T天的价格,需要通过交易来让手中的M枚金币尽可能变多,并且交易不限次数且没有手续费。

首先看数据范围:

对于T=1的10分,因为只有一天,所以每件物品只有一个价格,无论进行多少次买卖,钱都不会变多。因此T=1时直接输出M即可。

对于N=1的15分,只有一件商品,那么只要明天比今天贵,今天应该能买多少就买多少。因为明天可以先直接全部卖掉,这样就实现了赚钱最大化,然后再考虑明天是否重新买回。

由N=1的情况进一步总结得出,对于每一天的每件物品,就是使用当天的价格赚取今明两天的差价。这实际上是一个完全背包问题的模型,每天都是一轮完全背包问题。每一天手中的金币为背包总体积,每件物品的体积就是物品当天的价格,每件物品的价值就是当天与次日的价格差,这样做一次完全背包就能计算出来每天最多能赚多少钱。程序的时间复杂度是O(NMT)。