P2938 [USACO09FEB]股票市场Stock Market

题目描述

尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道 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 ≤ D1jD,1 ≤ Pi1Pi;j ≤ 1000j1000

输出格式

单个整数:表示奶牛可以获得的最大钱数,保证这个数不会超过 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;
}

 

posted @ 2019-06-21 23:03  CZD648  阅读(167)  评论(0编辑  收藏  举报
Live2D