【发布时间】:2022-01-21 19:07:21
【问题描述】:
问题:
有 N 件作品需要分配给 2 人。人 A 可以在 a[i] 时间内完成工作 i,人 B可以在 b[i] 时间内完成工作。
每项工作只能分配给 1 人。分配好作品后,每个人各自做自己的作品。
总时间将是 2 人所用总时间中较大的一个。
找到一种分配工作的方法,使总时间最短。
示例:
N = 6
a[] = 10 100 30 50 50 80
b[] = 100 30 40 40 60 90
Answer: 130
Explaination:
Person A do work 1, 3, 6 -> total time: 120
Person B do work 2, 4, 5 -> total time: 130
Overall time: 130
限制:
N <= 100
a[i], b[i] <= 30.000
我的看法
我尝试用动态编程解决它,更具体地说:DP[i][p][c]
i 是到目前为止完成的工作数量,p 是到目前为止 A 人的总时间,c 是 B 人的总时间,所以远的。对于每个 i,我们可以尝试将工作分配给 A 或 B,然后将最佳答案保存在 DP[i][p][c] 中,这样我们就不必重新计算了。
但 p 和 c 可以达到 3.000.000,所以我尝试将其缩小到 DP[i][max(p,c)]
下面的代码给出了示例案例的正确答案,以及我生成的其他案例:
int n, firstCost[105], secondCost[105];
int dp[105][300005];
int solve(int i, int p, int c){
if(i > n) return max(p, c);
int &res = dp[i][max(p, c)];
if(res != -1) return res;
res = INT_MAX;
int tmp1 = solve(i+1, p + firstCost[i], c);
int tmp2 = solve(i+1, p, c + secondCost[i]);
res = min(tmp1, tmp2);
return res;
}
int main(){
// input...
cout << solve(1, 0, 0);
}
但是当我提交它时,它给出了错误的答案:
20
4034 18449 10427 4752 8197 7698 17402 16164 12306 5249 19076 18560 16584 18969 3548 11260 6752 18052 14684 18113
19685 10028 938 10379 11583 10383 7175 4557 850 5704 14156 18587 2869 16300 15393 14874 18859 9232 6057 3562
我的输出是77759,但答案应该是80477。
我不知道我做错了什么,有什么办法可以改进我的解决方案吗?
P/S:
Here's the original problem,页面是越南语,你可以创建一个帐户并在那里提交
【问题讨论】:
-
@Yunnosch 我已经添加了对我的解决方案的更好解释,请检查
-
@Yunnosch n 最多 20,这种情况的可能性太多,我无法弄清楚我错的确切点
-
我把它做得最小但可以理解
标签: c++ algorithm dynamic-programming