我正在尝试实施一种算法,该算法采用多个距离的路线以及某人有时间走这条路线的天数。该算法应计算每天的最小最长距离。
我已经在数学中问过,因为我需要帮助来找到数学函数。在那里你可以找到一个例子来更容易理解我的意思。 See Here.
我试图实现建议的递归函数:
Md(e1,…,en) = min{Md(e1,…,e′n−1), max{M d−1(e1,…,en−1), en}}
Md(e1,…,en)
是所有分组中最长阶段的最小值,e1-en
是距离,Md
是d
天的函数,假设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.
现在我问我是否在执行中犯了错误,或者在开头是否错误。 有人有想法吗?谢谢你。
答案 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#是一个相当快速的过程。它产生了两个例子的预期值,但尚未经过其他任何测试,因此请确保在预期它适用于每个案例之前进行测试!