1 条题解

  • 0
    @ 2026-2-3 12:05:20
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:t代表总采药时间,m代表草药的数量
    int t,m; 
    // [2] 结构体:存储每株草药的采摘时间和对应的价值
    struct stu{
    	int time,value;
    }arr[1100]; // [3] 结构体数组:存储所有草药的时间和价值信息
    
    int main() {
        // [4] 输入总采药时间t和草药数量m
        cin>>t>>m;
        // [5] 循环读取每株草药的时间和价值,存入结构体数组
        for(int i=1;i<=m;i++){
        	cin>>arr[i].time>>arr[i].value;
    	}
        
        // [6] 创建一维动态规划数组dp,dp[j]表示时间j内能获得的最大价值,初始值为0
        vector<int> dp(t+1);
        // [7] 遍历每一株草药(01背包的物品遍历)
        for(int i=1;i<=m;i++){
        	// [8] 倒序遍历时间:避免同一株草药被重复选取(01背包空间优化的核心操作)
        	for(int j=t;j>=0;j--){
        		// [9] 判断当前剩余时间是否足够采摘第i株草药
        		if(j>=arr[i].time){
        			// [10] 更新dp[j]:取“不选当前草药的原有价值”和“选当前草药的价值(剩余时间的最大价值+当前草药价值)”中的较大值
        			dp[j]=max(dp[j],dp[j-arr[i].time]+arr[i].value);
    			}
    		} 
    	}
    	// [11] 输出总时间t内可获得的最大草药价值
    	cout<<dp[t];
        return 0;                  
    }
    
    • 1

    信息

    ID
    1357
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者