首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小成本的收发网络

最小成本的收发网络
EN

Stack Overflow用户
提问于 2016-11-25 09:45:17
回答 2查看 148关注 0票数 3

假设我们有n设备,n偶数。每个设备都可以作为发射机(T)或接收器(R)工作。对于每一个设备i,我们都有两个数字,TiRiTi是设备作为发射机工作时的成本,Ri是作为接收器工作的成本。我们还知道,Ti>=Ri对于每一个i

我们的任务是选择准确的n/2发射机和n/2接收机,以达到最低的成本。(最后的答案是最低成本)

附加限制:传送者总是从左向右发送。这意味着我们可以有序列TTTRRRTTRTRRTRTRTR等,而不是RTTTRR。在任何时候,我们都不会遇到比发射机更多的接收器。

哪一种算法最适合这个任务?

例:我们有4个设备。T1=9,R1=6,T2=6,R2=2,T3=8,R3=1,T4=5,R4=3

  • 可能的解决方案1:TTRR总成本: 9+6+1+3 =19
  • 可能的解决方案2:TRTR总成本: 9+2+8+3 =22

最优解:TTRR,成本19。

最后的答案是19。

EN

回答 2

Stack Overflow用户

发布于 2016-11-25 10:31:18

O(n^2)动态规划解决方案非常简单。

假设f(prefix_len, transmitters)是人们可以获得的最优成本,prefix_len元素已经被处理过,前缀是正确的,发送者的数量恰好比接收者的数量多(也就是说,在某种意义上是“平衡”)。

基本情况是f(0, 0) = 0 (空前缀是免费的)。这些转换如下所示:f(prefix_len, transmitters) + T[i] -> f(prefix_len, transmitters + 1) (我们将当前元素作为发射机)。如果是transmitters > 0,也有一个转换f(prefix_len, transmitters) + R[i] -> f(prefix_len + 1, transmitters - 1) (我们把它变成接收器)。

答案是f(n, 0) (也就是说,我们使用了所有的元素,发射器的数量等于接收者的数量)。

票数 1
EN

Stack Overflow用户

发布于 2016-11-25 13:59:31

下面是kraskevich的大纲的一个注释的递归JavaScript实现:

代码语言:javascript
复制
var ts = [9,6,8,5],
    rs = [6,2,1,3],
    n = ts.length;

// returns cost from index i forward, with t more transmitters than receivers
function f(i,t){
  // last one must be a receiver
  if (i === n - 1) return rs[n-1];

  return Math.min(
    // avoid having more transmitters than we can receive
    t + 1 <= (n - i + 1) >> 1 ? ts[i] + f(i + 1,t + 1) : Infinity,

    // don't encounter more receivers than transmitters
    t > 0 ? rs[i] + f(i + 1,t - 1) : Infinity
  );
}

console.log(f(0,0)); // 19
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40801899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档