我有以下代码来搜索适合给定总和的组合。但是问题出在十进制数字低。
就像,当我尝试将总和11.90与3.15和0.40拟合时,程序将启动无限循环。当我尝试3.15和2.45时,我收到以下结果(3.15 | 3.15 | 3.15 | 2.45)是正确的。
public static void findNumbers(List<double> ar, double sum, List<List<double>> res, List<double> r, int i)
{
// If current sum becomes negative
if (sum < 0)
{
return;
}
// if we get exact answer
if (sum < 2)
{
res.Add(r);
return;
}
// Recur for all remaining elements that
// have value smaller than sum.
while (i < ar.Count() && sum - ar[i] >= 0)
{
// Till every element in the array starting
// from i which can contribute to the sum
r.Add(ar[i]); // Add them to list
// recur for next numbers
findNumbers(ar, sum - ar[i], res, r, i);
i++;
r.RemoveAt(r.Count() - 1);
}
}
我知道如何进行此循环。
答案 0 :(得分:1)
您的代码有恕我直言2可以讨论的重点
如果(总和<2)
您不应该寻找确切的金额吗?例如sum == 0或更好Math.Abs(sum)<公差(如0.0005),因为您正在使用double。
res.Add(r);
使用res.Add(r),您将添加对r的引用。 但是然后使用r.RemoveAt(r.Count()-1);您在res列表中引用的r也将受到影响。因此,我建议将r的副本添加到res:
res.Add(r.GetRange(0, r.Count));
编辑:
在https://github.com/hcetinkaya/Combinations.git上查看工作示例
您的样本的总和= 11.90,数组为3.15和0.4,公差为2.0 => 9.90 <=总和<= 11.90,得出以下结果:
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 3,15, 3,15, 3,15)