1 条题解

  • 0
    @ 2026-2-7 11:43:27
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:t代表总采摘时间,m代表灵芝的种类数
    int t,m;
    
    int main(){
        // [2] 输入总时间t和灵芝种类数m
        cin>>t>>m;
        // [3] 定义数组存储每种灵芝的采摘时间与价值,下标从1开始便于后续循环处理
        vector<int> time(m+1);
        vector<int> value(m+1);
        // [4] 循环读取m种灵芝的时间和价值
        for(int i=1;i<=m;i++)
    	{
        	cin>>time[i]>>value[i]; // 输入第i种灵芝的采摘时间和对应价值
    	}
    	
    	// [5] dp数组:dp[j]表示在时间j内可获得的最大价值,初始默认值为0
    	vector<long long> dp(t+1);
    	// [6] 完全背包问题:遍历每一种灵芝
    	for(int i=1;i<=m;i++)
    	{
    		// [7] 遍历时间维度,从当前灵芝的采摘时间开始(时间不足时无法采摘该灵芝)
    		for(int j=time[i];j<=t;j++){
    			// [8] 状态转移:比较“不选当前灵芝”和“选当前灵芝”的价值,取最大值更新dp[j]
    			dp[j]=max(dp[j],dp[j-time[i]]+value[i]);
    		}
    	}
    	// [9] 输出总时间t内可获得的最大价值
    	cout<<dp[t];
        return 0;
    }
    

    信息

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