Description

Solutions
考虑使用 完全背包DP 来解题。
由于每天可以无限次交易,那么我们每一天都可以先把之前买进的全部卖出,再按最优方案购进。
我们可以通过下面这个例子来理解这种做法:
| 编号\天数 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 1号 | 10 | 20 | 30 | 10 |
1号第一天买入,第三天卖出明显是最优方案,利润为 $$20x(x表示个数)$$ ,我们以刚刚说的方法做。
假设第一天拥有 100 金币。
| 天数 | 买入个数 | 卖出个数 | 拥有的金币和物品的总价值 |
|---|---|---|---|
| 1 | 10 | 0 | 100 |
| 2 | 10 | 10 | 200 |
| 3 | 0 | 10 | 300 |
所以说明中途进行买卖是不会影响最优方案的。
但有些东西在中途需要进行买卖,那么我们就卖出后再算出当天最优方案,再购进当天的纪念品。
那怎么计算每天的最优方案呢?
要想赚得最多,最优方案肯定会满足以下条件:
| 1 | 购进的物品下一天会盈利。 |
|---|---|
| 2 | 购进的物品的利润(下一天价格比该天的高出的部分)相对较高但价格会相对较低 |
| 3 | 持有的金钱基本都会被花掉,用于买满足第一条条件的物品上,故最后剩下来的钱会比满足第一条条件的物品的当天价格都要小。 |
综上所述,最优方案可以用完全背包求。
所以,只需要先知道每一天持有的金币数,再做一遍完全背包求出当天可获得的最大价值,然后用这个最大价值求出下一天持有的金币数,就可求出最后一天持有的金币数,即答案。
这道题就做完了,详细细节见 代码 。
Code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |