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 |
|