我在找到解决此问题的方法时遇到问题:
数组= [5,10,10,15,21]
requiredNumber = 46
返回结果= [10,15,21]或[5,10,10,21]
是否有一种非递归方式从数组中返回最多36个整数的组合?我试图尽可能简化实施。
答案 0 :(得分:1)
我认为你正在寻找的是一种非递归的方式来从一组价值中找到所有组合"
这是概念中的一种方式:
有一个位设置,其位数等于您的值集中的元素数。例如,对于5元素数组的情况,您需要5位。
(查看您的位设置为整数)从0开始,并继续递增。对于每个值,您将得到一组你的组合。
e.g。
array = [1,2,3,4,5]
for (bits 0b00000 to 0b11111) {
sum array base on bits (only sum if corresponding bits turned on)
if sum equals to desired value, then return
}
如果您确定您的数组小于31/63值,那么使用int / long将非常简单。如果您想要更长的数组,通过使用BigInteger(或BitSet可能)来实现此目的,这仍然很容易。
硬编码值的一个例子,但它应该给你一个想法(没有编译,请承担语法错误:P):
int[] array = new int[]{1,2,3,4,5};
for (int bits = 0; bits < 32; ++bits) { // bits < 2^5
System.out.print("[");
for (int i = 0; i < 5; ++i) {
if ((bits & 1 << i) != 0) { // i-th bit is ON
System.out.print(" " + array[i]);
}
}
System.out.println(" ]");
}
上面的代码应该为您提供所有组合。改变你想做的事情(找到具体的总和)应该是微不足道的