拟合数字的最佳方法
Posted
技术标签:
【中文标题】拟合数字的最佳方法【英文标题】:Best approach to fit numbers 【发布时间】:2016-12-25 05:20:28 【问题描述】:我有以下整数集2,9,4,1,8
。我需要将此集合分成两个子集,以便集合的总和分别为 14 和 10。在我的示例中,答案是2,4,8
和9,1
。我不是在寻找任何代码。我很确定必须有一个标准算法来解决这个问题。由于我没有成功通过谷歌搜索并发现自己,我在这里发布了我的查询。那么解决这个问题的最佳方法是什么?
我的尝试是这样的......
public class Test
public static void main(String[] args)
int[] input = 2, 9, 4, 1, 8;
int target = 14;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < input.length; i++)
stack.add(input[i]);
for (int j = i+1;j<input.length;j++)
int sum = sumInStack(stack);
if (sum < target)
stack.add(input[j]);
continue;
if (target == sum)
System.out.println("Eureka");
stack.remove(input[i]);
private static int sumInStack(Stack<Integer> stack)
int sum = 0;
for (Integer integer : stack)
sum+=integer;
return sum;
我知道这种方法甚至无法解决问题
【问题讨论】:
这就是多重背包问题。 en.wikipedia.org/wiki/Knapsack_problem 还是装箱问题。这在一定程度上取决于您未指定的其他约束,例如是否需要使用所有元素。 @ErwinBolwidt 最后应使用所有元素。我说我的问题有 2 个子集结果。我需要一个通用算法将父集划分为 n 个子集,其中每个子集的总和为某个指定的数字。 【参考方案1】:我需要将这个集合分成两个子集,这样集合的总和分别为 14 和 10。
如果子集必须对某些值求和,那么整个集合的总和最好是这些值的总和,即在您的示例中为 14+10=24。如果你只需要找到这两个子集,那么问题就不是很困难——找到任何一个总和为其中一个值的子集,并且该集合的其余元素必须总和为另一个值。
对于您给出的示例集2,9,4,1,8
,您说 答案是9,1, 2,4,8
,但请注意,这不是唯一的答案;还有2,8, 9,4,1
。
【讨论】:
“不是很难”从哪个角度?如何以幼稚的方式实现,或者时间复杂度的问题? :-) @Caleb 确实如此。最好的解决方案是列出所有可能的集合。谢谢指出以上是关于拟合数字的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Python数据可视化之绘制带有最佳拟合线的散点图(图文并茂版!!!)
数据可视化实例: 带线性回归最佳拟合线的散点图(matplotlib,pandas)