我有一个充满随机整数的随机长度数组。为简单起见,它们按从高到低的顺序排列。
我也有一个目标随机整数。
我需要在不使用不必要的数字的情况下获得总和大于或等于目标的所有组合。给定这个例子:
nums = [10, 6, 5, 3, 2, 1, 1]
target = 8
我想要这个输出:
10 (10 is higher or equal to 8, so there's no need to sum it)
6+5
6+3
6+2
6+1+1
5+3
5+2+1
5+2+1 (Note that this result is different from the previous since there are 2 1s)
我尝试了很多递归策略,但我找不到正确的答案。不需要特定的语言,欢迎使用伪代码。
编辑:发布代码
private static boolean filtrar(final CopyOnWriteArrayList<Padre> padres) {
if (sum(padres) < TARGET) {
return false;
}
int i;
for (i = padres.size(); i >= 0; i--) {
if (!filtrar(copiaPadresSinElemento(padres, i-1))) {
break;
}
}
// Solución óptima, no se puede quitar nada.
if (i == padres.size()) {
print(padres);
}
return true;
}
private static int sum(final CopyOnWriteArrayList<Padre> padres) {
int i = 0;
for (final Padre padre : padres) {
i += padre.plazas;
}
return i;
}
private static void print(final CopyOnWriteArrayList<Padre> padres) {
final StringBuilder sb = new StringBuilder();
for (final Padre padre : padres) {
sb.append(padre);
sb.append(", ");
}
final String str = sb.toString();
System.out.println(str);
}
private static CopyOnWriteArrayList<Padre> copiaPadresSinElemento(
final CopyOnWriteArrayList<Padre> padres, final int i) {
final CopyOnWriteArrayList<Padre> copia = new CopyOnWriteArrayList<Padre>();
for (int e = 0; e < padres.size(); e++) {
if (e != i) {
copia.add(padres.get(e));
}
}
return copia;
}
Padre 是一个简单的对象,其中包含每个数字的名称。Padre.plazas 是数字。
现在的数组是 [6,4,4,4,3,3,3],目标是 8。