1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; /* 在第a天买入,第b天卖出(b>a) 等价于:第a天买入,第a+1天卖出,第a+1天买入,第a+2天卖出……最后在第b天卖出。 -price[a] + price[b] = -price[a] + price[a+1] - price[a+1] + price[a+2] - price[a+2] +...+price[b] 从而将多天的买卖转换为:周期为1天的交易。 初始金币数:M 目标:让第二天的金币数尽可能的多,再让第三天的金币数量尽可能多,依次类推…… 贪心求解: 第i天金币数量M(i),第i+1天的金币数量M(i+1) 第i天可以买纪念品无限多个,第i天有M(i)个金币,那么最大收益就是完全背包问题! 背包容量:Mi 体积:price(i) M(i+1)=M(i)+最大收益 本题只需要计算:price(i)<price(i+1)的数据,来减少循环! 本题相当于做N-1次背包! */ const int N = 110,M = 10010; int t,n,m; int w[N][N]; int f[M]; int main() { cin>>t>>n>>m; for(int i= 1; i <= t; i++) { for(int j = 1; j <= n; j++) { cin>>w[i][j]; } } //做t-1次 for(int i = 1; i < t; i++) { memset(f,0,sizeof(f)); //完全背包 //有收益再做完全背包 for(int j = 1; j <= n; j++) { if(w[i+1][j] > w[i][j]) { for(int k = w[i][j]; k <= m; k++) { f[k] = max(f[k],f[k-w[i][j]] + w[i + 1][j] - w[i][j]); } } } m+=f[m]; } cout<<m; return 0; }
- 1
信息
- ID
- 854
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者