子集和成对的两个

时间:2013-08-22 07:09:09

标签: algorithm subset subset-sum

这是一个采访问题:

  4名男子 - 每人可以在1,3,7和10分钟内过桥。只有2个人   可以一次走桥。他们需要多少分钟   过桥?

我可以手动想出一个解决方案:10和7聚在一起,一旦7到达目的地,'3'跳跃,10和3一起完成。现在1完成,总时间为11.因此,{10,7}后跟{10,3}后跟{1}。

我无法思考如何将其作为一般算法实现到代码中。有人可以帮我确定如何将这个想法转换成一些真正的代码吗?

2 个答案:

答案 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。一般来说,为工作车间调度计算精确的解决方案很难。