P1926 小书童——刷题大军 题解

题意分析

小 A 有 n 道喜欢的题目,每道题目需要一定的时间才能完成,对于完成作业,老师布置了 m 项作业,每项作业需要一些时间和能获得一定的分值。完成至少 k 分的作业是及格标准。小 A 希望在有 r 单位时间内,除了完成这些作业外,能尽可能多地做他喜欢的题目。

状态转移方程

  1. 完成作业的价值:
    • 使用动态规划来计算在有 r 单位时间下,最大能获得的分值。定义一个数组 dp[r+1],其中 dp[j] 表示在 j 单位时间内能获得的最大分值。
    • 对于每项作业 i (时间为 ht[i], 分值为 hw[i]),状态转移方程为:
dp[j] = max(dp[j], dp[j - ht[i]] + hw[i]) 
  1. 检查及格情况:

    • 在计算完所有作业的最大分值后,遍历 dp 数组,检查具备及格分数 k 的最小时间,更新剩余时间 r
  2. 完成题目的数量:

    • 对于剩余时间,在可用的时间内做最大数量的题目。定义一个新的动态规划数组 dp1[r+1],其中 dp1[j] 表示在 j 单位时间内能做的题目数量。
    • 对于每道题目 i (需要时间为 p[i]),状态转移方程为:
dp1[j] = max(dp1[j], dp1[j - p[i]] + 1)

C++ 代码实现

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

const int N = 25;
int n, m, k, r;
int p[N];  // 每道题目的时间
int ht[N]; // 每项作业需要的时间
int hw[N]; // 每项作业的分值
int dp[250]; // 动态规划数组

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    // 读取输入
    cin >> n >> m >> k >> r;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];  // 题目的时间
    }
    for (int i = 1; i <= m; i++) {
        cin >> ht[i]; // 作业的时间
    }
    for (int i = 1; i <= m; i++) {
        cin >> hw[i]; // 作业的分值
    }

    // 动态规划计算作业的最大分值
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= m; i++) {
        for (int j = r; j >= ht[i]; j--) {
            dp[j] = max(dp[j], dp[j - ht[i]] + hw[i]);
        }
    }

    // 找到第一个满足及格条件的时间
    for (int i = 1; i <= r; i++) {
        if (dp[i] >= k) {
            r -= i; // 更新剩余时间
            break;
        }
    }

    // 计算在剩余时间内可以做完的题目数量
    int dp1[250] = {0}; // 动态规划数组
    for (int i = 1; i <= n; i++) {
        for (int j = r; j >= p[i]; j--) {
            dp1[j] = max(dp1[j], dp1[j - p[i]] + 1);
        }
    }

    // 输出结果
    cout << dp1[r] << "\n";
    return 0;
}

អ្នក​គ្រូ ខ្ញុំ​ចង់​ឲ្យ​ក្រុមហ៊ុន​គ្រួសារ​របស់​អ្នក​ទាំងមូល​សុវត្ថិភាព និង​សុវត្ថិ

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值