题目描述
尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道 SS 只股票在今后 DD 天内的价格。
假设在一开始,她筹集了 MM 元钱,那么她该怎样操作才能赚到最多的钱呢?贝西在每天可以买卖多只股票,也可以多次买卖同一只股票,交易单位必须是整数,数量不限。举一个牛市的例子:
假设贝西有 10 元本金,股票价格如下:
股票 | 今天的价格 | 明天的价格 | 后天的价格 |
---|---|---|---|
AA | 10 | 15 | 15 |
BB | 13 | 11 | 20 |
最赚钱的做法是:今天买入 AA 股 1 张,到明天把它卖掉并且买入 B 股 1 张,在后天卖掉 B股,这样贝西就有 24 元了。
输入格式
第一行:三个整数 S, D 和 M,2 ≤ S ≤ 50 ; 2 ≤ D ≤ 10 ; 1 ≤ M ≤ 2000001
第二行到第 S + 1 行:第 i + 1 行有 D 个整数: P_{i;1}Pi;1 到 P_{i;D},表示第 ii 种股票在第一天到最后一天的售价,对所有1 ≤ j ≤ D1≤j≤D,1 ≤ Pi1≤Pi;j ≤ 1000j≤1000
输出格式
单个整数:表示奶牛可以获得的最大钱数,保证这个数不会超过 500000
解析:我们可以发现每一天同一个股票,买入价与售出价相等。这代表我可以看做在一天中,我先不管三七二十一把所有股票都售出,然后再选能赚钱的再买,也就变成了一个s遍的完全背包。代码如下:
#include<bits/stdc++.h> using namespace std; int a[51][51]; int dp[500001]; int w[51],v[51]; int main() { int n,m,money; scanf("%d%d%d",&n,&m,&money); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[j][i]); } } for(int i=1;i<=m-1;i++) { for(int j=1;j<=n;j++) { w[j]=a[i][j]; v[j]=a[i+1][j]; } for(int j=0;j<=money;j++) dp[j]=j; for(int k=1;k<=n;k++) { for(int j=w[k];j<=money;j++) { dp[j]=max(dp[j],dp[j-w[k]]+v[k]); } } money=dp[money]; } cout<<money; return 0; }