最小最长距离算法,实现问题

时间:2014-06-02 09:42:21

标签: c# algorithm

我正在尝试实施一种算法,该算法采用多个距离的路线以及某人有时间走这条路线的天数。该算法应计算每天的最小最长距离。

我已经在数学中问过,因为我需要帮助来找到数学函数。在那里你可以找到一个例子来更容易理解我的意思。 See Here.

我试图实现建议的递归函数:

Md(e1,…,en) = min{Md(e1,…,e′n−1), max{M d−1(e1,…,en−1), en}}

Md(e1,…,en)是所有分组中最长阶段的最小值,e1-en是距离,Mdd天的函数,假设Md(e1,e2,…,en)=max{e1,…,en} 1}} if d≥n

我尝试实现这一点就在这里:

private static int recursiveMin(int[] teilstrecken, int days)
    {

        List<int> tempList1 = new List<int>(teilstrecken);
        int last = tempList1.Last();
        tempList1.Remove(tempList1.Last());
        int vorletzter = tempList1.Last();
        List<int> tempList2 = new List<int>(teilstrecken);
        tempList1.Remove(tempList1.Last());
        tempList1.Add(last + vorletzter);
        tempList2.Remove(tempList2.Last());

        int[] array1 = tempList1.ToArray();
        int[] array2 = tempList2.ToArray();

        if (nEtappen >= teilstrecken.Length)
        {
            return array1.Max();
        }

        return Math.Min(recursiveMin(array1, days), Math.Max(recursiveMin(array2, days-1), last));
    }

但这并不能归还我想要的东西。 一个例子:

3天内的

{64, 23, 56, 34, 23, 65, 28}应该返回113,而是返回90.

现在我问我是否在执行中犯了错误,或者在开头是否错误。 有人有想法吗?谢谢你。

1 个答案:

答案 0 :(得分:0)

首先,请为变量命名,以便您或其他人了解他们在6个月内的意思;)

认为方法不对,在这里重做更容易:

private static int recursiveMin(int[] distances, int days) {
      // check for edge cases (single distance or one day)
      if(distances.length == 1) {
         return distances[0];
      }
      if(days == 1) {
         int sum = 0;
         for(int i=0;i<distances.length;i++) {
            sum += distances[i];
         }
         return sum;
      }

      // get the last distance
      int last = distances[distances.length - 1];

      // create the reduced array
      int[] oneLess = new int[distances.length - 1];
      for(int i=0;i<oneLess.length;i++) {
         oneLess[i] = distances[i];
      }

      // this is the max{M d−1(e1,…,en−1), en} part
      int right = Math.max( recursiveMin( oneLess, days - 1 ), last );

      // now use the reduced array again but add the last value on at the end
      oneLess[oneLess.length - 1] += last;

      // this is the Md(e1,…,e′n−1) part
      int left = recursiveMin( oneLess, days );

      return Math.min( left, right );
   }

它是用Java完成的,但我相信如果你愿意的话,将它翻译成C#是一个相当快速的过程。它产生了两个例子的预期值,但尚未经过其他任何测试,因此请确保在预期它适用于每个案例之前进行测试!