1. 程式人生 > >【bzoj1578/Usaco2009 Feb】Stock Market 股票市場——完全背包

【bzoj1578/Usaco2009 Feb】Stock Market 股票市場——完全背包

include pla cst 現在 ont 最大化 股市 std 一個

Description

盡管奶牛們天生謹慎,她們仍然在住房抵押信貸市場中受到打擊,現在她們開始著手於股市。 Bessie很有先見之明,她不僅知道今天S (2 <= S <= 50)只股票的價格,還知道接下來一共D(2 <= D <= 10)天的(包括今天)。 給定一個D天的股票價格矩陣(1 <= 價格 <= 1000)以及初始資金M(1 <= M <= 200,000),求一個最優買賣策略使得最大化總獲利。每次必須購買股票價格的整數倍,同時你不需要花光所有的錢(甚至可以不花)。這裏約定你的獲利不可能超過500,000。 考慮這個牛市的例子(這是Bessie最喜歡的)。在這個例子中,有S=2只股票和D=3天。奶牛有10的錢來投資。 今天的價格 | 明天的價格 | | 後天的價格 股票 | | | 1 10 15 15 2 13 11 20   以如下策略可以獲得最大利潤,第一天買入第一只股票。第二天把它賣掉並且迅速買入第二只,此時還剩下4的錢。最後一天賣掉第二只股票,此時一共有4+20=24的錢。

Input

* 第一行: 三個空格隔開的整數:S, D, M

* 第2..S+1行: 行s+1包含了第s只股票第1..D天的價格

Output

* 第一行: 最後一天賣掉股票之後最多可能的錢數。

Sample Input

2 3 10
10 15 15
13 11 20

Sample Output

24
每一天的收益可以看成今天買明天賣(如果不是明天賣就先賣再賣),這樣就能轉變成對每一天分別做完全背包了。 註意每天過後手中的資金(即體積)會變為mx+f[mx]。-->在這一天資金為mx時最大獲利。 代碼: 技術分享
 1 #include<cstdio>
 2
#include<cstring> 3 #include<algorithm> 4 #define mem(a,p) memset(a,p,sizeof(a)) 5 int read(){ 6 int ans=0,f=1;char c=getchar(); 7 while(c<0||c>9){if(c==-)f=-1;c=getchar();} 8 while(c>=0&&c<=9){ans=ans*10+c-48;c=getchar();} 9 return
ans*f; 10 } 11 inline int max(int x,int y){return x>y?x:y;} 12 int pr[55][15],f[500005]; 13 int main(){ 14 int s=read(),d=read(),m=read(); 15 for(int i=1;i<=s;i++) 16 for(int j=1;j<=d;j++)pr[i][j]=read(); 17 for(int i=1;i<d;i++){ 18 mem(f,0); 19 for(int j=1;j<=s;j++){ 20 for(int k=pr[j][i];k<=m;k++){ 21 f[k]=max(f[k],f[k-pr[j][i]]+pr[j][i+1]-pr[j][i]); 22 } 23 } 24 m+=f[m]; 25 } 26 printf("%d",m); 27 return 0; 28 } 29
bzoj1578

【bzoj1578/Usaco2009 Feb】Stock Market 股票市場——完全背包