列表

详情


MT48. 考试策略

描述

小明同学在参加一场考试,考试时间 个小时。试卷上一共有 道题目,小明要在规定时间内,完成一定数量的题目。 考试中不限制试题作答顺序,对于 i 第道题目,小明有三种不同的策略可以选择: 

(1)直接跳过这道题目,不花费时间,本题得0分。
(2)只做一部分题目,花费 pi 分钟的时间,本题可以得到 ai 分。 
(3)做完整个题目,花费 qi 分钟的时间,本题可以得到 bi 分。
小明想知道,他最多能得到多少分。
数据范围:

输入描述

第一行输入一个n数表示题目的数量。

接下来n行,每行四个数p_i,a_i,q_i,b_i。

输出描述

输出一个数,小明的最高得分。

示例1

输入:

4
20 20 100 60
50 30 80 55
100 60 110 88
5 3 10 6

输出:

94

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-12-25

#include<stdio.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main(void)
{
    int n;
    scanf("%d",&n);
    int pi[120],ai[120],qi[120],bi[120],dp[120]={0};
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d%d",&pi[i],&ai[i],&qi[i],&bi[i]);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=120;j>=0;j--)
        {
            if(pi[i]<=j)
            {
                dp[j]=max(dp[j],dp[j-pi[i]]+ai[i]);
            }
            if(qi[i]<=j)
            {
                dp[j]=max(dp[j],dp[j-qi[i]]+bi[i]);
            }
        }
    }
    printf("%d\n",dp[120]);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-04-20

#include<stdio.h>
int max(int m,int n){
    int max;
    if(m>=n){
        max=m;
    }else{
        max=n;
    }
    return max;
}
int main() {
    int n,p[125]={0},a[125]={0},q[125]={0},b[125]={0},dp[125]={0};
    scanf("%d",&n);
    for(int i=0; i<n; i++) {
        scanf("%d %d %d %d",&p[i],&a[i],&q[i],&b[i]);
    }
    for(int i=0; i<n; i++) {
        for(int j=120; j>=0; j--) {
            if(p[i]<=j) {
                dp[j]=max(dp[j],dp[j-p[i]]+a[i]);
            }
            if(q[i] <= j)   //考虑这一题只做一半
                dp[j] = max(dp[j], dp[j-q[i]] + b[i]);
        }
    }
    printf("%d",dp[120]);
    return 0;
}

上一题