P2938 [USACO09FEB]Stock Market G 題解
阿新 • • 發佈:2020-11-21
題目大意就是每天我們可以購買,賣出股票,求出最大收益
那麼一開始我們寫的是個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; }