当成特殊的背包问题,用动态规划的方法。 核心:dp[x]表示在考试时间剩下x分钟时,能获得的最高分数。 两层循环,外层遍历物品(即本题中的考试题目,完整做完一题和部分做题视为同一个物品的两种价格和价值),内层循环遍历剩余时间。

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    int p[n+1],a[n+1],q[n+1],b[n+1];
    int total=120;
    p[0]=a[0]=q[0]=b[0]=0;
    for(int i=1;i<=n;i++){
        int temp,tema,temq,temb;
        cin>>temp>>tema>>temq>>temb;
        p[i]=temp;
        a[i]=tema;
        q[i]=temq;
        b[i]=temb;
    }
    vector<int> dp(total+1, 0); //dp[x]指在不超过x元的情况下最多能花多少钱
    for(int i = 1; i <= n; i++) //顺序遍历物品
    {
        for(int j = total; j >= 1; j--) //倒序遍历背包容量
        {
            if(j >= p[i])
            {
                dp[j] = max(dp[j], dp[j - p[i]] + a[i]);
            }
            if(j>=q[i])
            {
                dp[j] = max(dp[j], dp[j - q[i]] + b[i]);
            }
        }
            
    }
    cout << dp[total] << endl;
    return 0;
}