• 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;
    }
  • 相关阅读:
    资源链接
    Silverlight4 RIA应用开发
    社会心理学(第8版)
    C# 2.0 锐利体验
    C# 3.0 锐利体验
    C#面向对象设计模式纵横谈
    ASP.NET MVC2程序开发入门到精通
    Silverlight数独游戏
    StringBuilder研究和探索
    .NET 开发从入门到精通
  • 原文地址:https://www.cnblogs.com/chen-1/p/11067197.html
Copyright © 2020-2023  润新知