我疯狂地试图想出一种方法来制作一个不尝试每一个组合的程序。 一个简单的例子: 我想知道是否可以通过添加系列中的数字(2,5,10,20)来生成11,是否有一种简单的方法可以在不尝试每种可能性的情况下执行此操作? 在这种情况下,我们可以用三个2和一个5来完成。 感谢
答案 0 :(得分:3)
我认为我提出了某种解决方案
我们从n = 0
开始一个。你把列表的第n个元素放在堆栈的顶部。
湾如果堆栈中的数字总和大于目标数,则删除堆栈的最后一个元素并返回到a。 n = n + 1。如果从堆栈中删除的元素是较低的数字,那么您也删除下面的元素,并返回到a。 n =(集合中最后删除的数字的索引)+1
℃。如果不是,则尝试再次添加,然后返回b点。
d。这个算法是递归的,它会从你的堆栈中删除最后一个数字时停止,这个数字是你的较低数字(那么你不能从你的集合中生成数字),或者当你的堆栈中的数字总和等于您的目标号码(然后您可以从您的设置中生成)
运行示例:目标11,设置[20,10,5,2]
答案 1 :(得分:2)
一种方法是制定LP / IP模型。这是一个优化模型(使用ojAlgo编码),可以最大限度地减少加数总数。
final Variable tmpVar02 = new Variable("02").weight(1.0).lower(0.0).integer(true);
final Variable tmpVar05 = new Variable("05").weight(1.0).lower(0.0).integer(true);
final Variable tmpVar10 = new Variable("10").weight(1.0).lower(0.0).integer(true);
final Variable tmpVar20 = new Variable("20").weight(1.0).lower(0.0).integer(true);
final ExpressionsBasedModel tmpModel = new ExpressionsBasedModel();
tmpModel.addVariable(tmpVar02);
tmpModel.addVariable(tmpVar05);
tmpModel.addVariable(tmpVar10);
tmpModel.addVariable(tmpVar20);
final Expression tmpRequired = tmpModel.addExpression("Required").level(11.0);
tmpRequired.setLinearFactor(tmpVar02, 2.0);
tmpRequired.setLinearFactor(tmpVar05, 5.0);
tmpRequired.setLinearFactor(tmpVar10, 10.0);
tmpRequired.setLinearFactor(tmpVar20, 20.0);
final Result tmpResult = tmpModel.minimise();
System.out.println(tmpResult);
System.out.println();
System.out.println(tmpModel);
Runng代码生成此输出:OPTIMAL 4.0 @ [3.0,1.0,0.0,0.0]