【BZOJ】1578: [Usaco2009 Feb]Stock Market 股票市场

【题意】给定s个股票和d天,给出价格矩阵s*d,每天可以买入或卖出整数倍股票,初始资金m,求最大利益。m<=200000,s<=50,d<=10。

【算法】完全背包

【题解】关键在于转化:第一天买入-第三天卖出,相当于,第一天买入-第二天卖出-第二天买入-第三天卖出。那么买卖股票就变成相邻两天的事情了。

对于每一天,就是完全背包,总重量为资金,重量为当天价格,价值为第二天价格-当天价格

f[i][j]表示前i个股票使用资金j能获得的最大收益。

f[i][j]=f[i-1][j-A[i]]+A[i+1]-A[i]。

每天最终得到的最大收益就是当天买入第二天卖出后的净收益,加入资金中。如此做d-1次完全背包,得到答案。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000010;
int n,m,d,f[maxn],a[100][100];
int main(){
    scanf("%d%d%d",&n,&d,&m);
    for(int i=1;i<=n;i++)for(int j=1;j<=d;j++)scanf("%d",&a[j][i]);
    for(int k=1;k<d;k++){
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
            for(int j=a[k][i];j<=m;j++)
                f[j]=max(f[j],f[j-a[k][i]]+a[k+1][i]-a[k][i]);
        m+=f[m];
    }
    printf("%d",m);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7599847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值