尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道S只股票在今后D天内的价格。假设在一开始,她筹集了M元钱,那么她该怎样操作才能赚到最多的钱呢?贝西在每天可以买卖多只股票,也可以多次买卖同一只股票,交易单位必须是整数,数量不限。
举一个牛市的例子。假设贝西有10元本金,股票价格如下:
股票 今天的价格 明天的价格 后天的价格
A 10 15 15
B 13 11 20
最赚钱的做法是:今天买入 A 股 1 张,到明天把它卖掉并且买入 B 股 1 张,在后天卖掉 B 股,这样贝西就有24元了。
2 3 10
10 15 15
13 11 20
24
如果这题想成了贪心,那你就跪了。
这题可以用动规做,为什么没有后效性呢?
因为昨天的股票明天卖就相当于今天卖了再买回来。
接下来就可以当做完全背包做了。
#include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std; inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; } int n,m,Shares[105][105],Money,f[500005]; int main() { n=Get_Int(); m=Get_Int(); Money=Get_Int(); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) Shares[i][j]=Get_Int(); for(int i=2; i<=m; i++) { memset(f,0,sizeof(f)); for(int j=1; j<=n; j++) for(int k=Shares[j][i-1]; k<=Money; k++) f[k]=max(f[k],f[k-Shares[j][i-1]]+Shares[j][i]-Shares[j][i-1]); Money+=f[Money]; } printf("%d\n",Money); return 0; }
原文链接:https://blog.csdn.net/Bill_Yang_2016/article/details/53454517?ops_request_misc=&request_id=b5e600632dce4381ad8e7299e81689cb&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-22-53454517-null-null.268%5Ev1%5Econtrol&utm_term=%E6%BE%B3%E6%B4%B2%E8%B4%A2%E7%BB%8F