这是一个采访问题:
4名男子 - 每人可以在1,3,7和10分钟内过桥。只有2个人 可以一次走桥。他们需要多少分钟 过桥?
我可以手动想出一个解决方案:10和7聚在一起,一旦7到达目的地,'3'跳跃,10和3一起完成。现在1完成,总时间为11.因此,{10,7}后跟{10,3}后跟{1}。
我无法思考如何将其作为一般算法实现到代码中。有人可以帮我确定如何将这个想法转换成一些真正的代码吗?
答案 0 :(得分:2)
您描述的问题不是子集和。
但你可以:
order the array a by descending time
int time1 = 0; // total time taken by the first lane
int time2 = 0; // total time taken by the second lane
for i : 0..n
if(time1 < time2) // add the time to the most "available" lane
time1 += a[i];
else
time2 += a[i];
endif
endfor
return max(time1, time2);
答案 1 :(得分:1)
这不是子集和问题,而是作业车间调度问题。见Wikipedia entry on Job shop scheduling。你有四个“工作”,分别需要1分钟,3分钟,7分钟和10分钟,还有两个“通道”用于执行它们,即桥梁的容量2。一般来说,为工作车间调度计算精确的解决方案很难。