1 条题解

  • 0
    @ 2025-10-10 19:32:48

    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
    上传者