【发布时间】:2014-02-22 12:15:04
【问题描述】:
开始学习递归,我被这个简单的问题困住了。我相信有更优化的方法可以做到这一点,但首先我尝试学习蛮力方法。
我有包 A 和包 B,每个都有 n items 有一段时间(带有两位小数的浮点数)。这个想法是通过两个袋子分配物品并获得两个袋子的最小差异。我们的想法是尝试所有可能的结果。
我以为只在一个袋子里(比如说袋子 A),因为另一个袋子将包含所有不在袋子 A 中的物品,因此差值将是总乘以总和的绝对值 - 2 * 总和包A中的物品时间。
我这样调用我的递归函数:
min = total_time;
recursive(0, items_number - 1, 0);
函数的代码是这样的:
void recursive(int index, int step, float sum) {
sum += items_time[index];
float difference = fabs(total_time - 2 * sum);
if (min > difference) {
min = difference;
}
if (!(min == 0.00 || step == 1 || sum > middle_time)) {
int i;
for (i = 0; i < items_number; i++) {
if (i != index) {
recursive(i, step - 1, sum);
}
}
}
}
想象一下我有 4 件物品与时间1.23, 2.17 , 2.95 , 2.31
我得到了结果0.30。我相信这是正确的结果,但我几乎可以肯定,如果它是纯粹的变化,因为如果我尝试更大的情况,程序会在一段时间后停止。可能是因为递归树变大了。
有人能指点我一个方向吗?
【问题讨论】:
-
items_number和number_of_pizzas到底是什么?也很高兴知道middle_time是什么,尽管我认为它是total_time的一半。看到完整的源代码也很好。 -
对不起。犯了一个错误。是
items_number,即物品的总量。我举的例子中有四个。你是对的。middle_time是total_time的一半