本题是一个变形的背包问题:每个任务可以选择两种“花费”(工时),其中一种会额外消耗 1 张脚本券。目标是先最大化完成任务数,在此基础上最小化总工时消耗,并满足总工时 ≤ H、脚本券 ≤ T。
算法:动态规划(DP,二元约束下的最优化-可行性分离)
dp[j][k] 表示在处理若干任务后,恰好完成 j 个任务、使用 k 张脚本券时的最小总工时。
初始化:dp[0][0] = 0,其余为正无穷。一个项目团队面对 N 个待完成的任务,每个任务都有两种处理方式:
团队当前拥有 H 个单位的可用总工时和 T 张脚本券。每个任务的人工工时和脚本工时均为已知的正整数。 实验室的目标是:在总工时和脚本券的限制下,尽可能多地完成任务;若有多解,使得总工时消耗最小。
数据范围:
第一行包含三个整数 N,H,T,分别表示任务数量、可用总工时和脚本券数量。 接下来 N 行,每行包含两个整数 ai,bi,依次表示第 i 个任务的人工工时和脚本工时。
输出一行,包含两个用空格分隔的整数:第一个整数表示在工时和脚本券限制下能完成的最多任务数;第二个整数表示达到该任务数所需的最小总工时。
输入
1 2 1
5 3
输出
0 0
说明
任务数为 1,总工时 H=2,脚本券 T=1。该任务人工工时为 5,脚本工时为 3。由于人工工时 5>2 且脚本工时 3>2,两种处理方式均超出可用总工时,因此无法完成任何任务。在任务数为 0 的情况下,总工时消耗也为 0。
输入
2 6 0
3 1
4 2
输出
1 3
说明
任务数 N=2,可用总工时 H=6,脚本券数量 T=0。由于没有脚本券,两个任务均只能使用人工方式,人工工时分别为 3 和 4。若尝试完成两个任务,总工时将达到 3+4=7>6,无法满足限制。若只完成一个任务,选择人工工时较小的任务,工时消耗为 3。因此最多可完成 1 个任务,对应的最小总工时消耗为 3。
输入
3 10 1
8 4
5 2
6 3
输出
2 8
说明
共有 3 个任务,总工时 H=10,脚本券 T=1。设三个任务分别为 A(人工 8, 脚本 4)、B(人工 5, 脚本 2)、C(人工 6, 脚本 3)。由于只有 1 张脚本券,至多将一个任务以脚本方式执行,其余只能人工执行。
考察完成 2 个任务的可能性:
8。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.