1. 程式人生 > 實用技巧 >P2938 [USACO09FEB]Stock Market G 題解

P2938 [USACO09FEB]Stock Market G 題解

題目大意就是每天我們可以購買,賣出股票,求出最大收益

那麼一開始我們寫的是個01揹包,就是讓每輪結束後強制賣出,做\(D-1\)次01揹包,但是很不幸,wa了

我又看了一遍題目發現,題目並沒有限制一種股票在一天只能夠出售一次

所以這應該是一個多重揹包

每次做的時候

以物品的價格為體積,當前的貨幣量為體積

因為買完之後,我們肯定是要賣出的,所以我們可以把後一天與這一天的價值之差當做物品的價值

程式碼

#include<bits/stdc++.h>
using namespace std;
const int N=300;
int a[N][N];
int dp[600000];
int S,D,M;
int main()
{
	cin>>S>>D>>M;
	for(int i=1; i<=S; i++)
	{
		for(int j=1; j<=D; j++)
		{
			cin>>a[i][j];
		}
	}
	for(int i=1; i<D; i++)
	{
		memset(dp,0,sizeof(dp));//每輪結束後強制都賣出
		for(int j=1; j<=S; j++)
		{
			for(int k=a[j][i]; k<=M; k++)
			{
				dp[k]=max(dp[k],dp[k-a[j][i]]+a[j][i+1]-a[j][i]);
			}
		}
		M+=dp[M];
	}
	cout<<M<<endl;
}