Java 达到目标整数

Java 达到目标整数,java,arrays,Java,Arrays,我有一个随机长度的数组,里面满是随机整数。为了简单起见,它们是从最高到最低排列的 我还有一个目标随机整数 我需要得到所有总和大于或等于目标的组合,而不需要使用不必要的数字。举个例子: 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 (No

我有一个随机长度的数组,里面满是随机整数。为了简单起见,它们是从最高到最低排列的

我还有一个目标随机整数

我需要得到所有总和大于或等于目标的组合,而不需要使用不必要的数字。举个例子:

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;
    }
private静态布尔过滤器(最终CopyOnWriteArrayList焊盘){
if(总和(padres)<目标值){
返回false;
}
int i;
对于(i=padres.size();i>=0;i--){
如果(!filtrar(copiaPadresSinElemento(padres,i-1))){
打破
}
}
//索卢西翁·普蒂玛,没有其他人。
如果(i==padres.size()){
印刷品(教士);
}
返回true;
}
专用静态整数和(最终CopyOnWriteArrayList焊盘){
int i=0;
用于(最终教士:教士){
i+=牧师广场;
}
返回i;
}
专用静态无效打印(最终CopyOnWriteArrayList padres){
最终StringBuilder sb=新StringBuilder();
用于(最终教士:教士){
某人(教士);
某人加上(“,”);
}
最后一个字符串str=sb.toString();
系统输出打印项次(str);
}
专用静态CopyOnWriteArrayList copiaPadresSinElemento(
最终CopyOnWriteArrayList焊盘,最终int i){
最终CopyOnWriteArrayList copia=新CopyOnWriteArrayList();
对于(int e=0;e
Padre是一个简单的对象,它包含每个数字的名称。帕德雷·普拉扎斯是号码


现在的数组是[6,4,4,4,3,3],目标是8。

我认为类似的方法可以工作:

function filter(array, target): Boolean{ //assumes array is sorted in descending order
  if(sum(array) < target) return false;
  for(i = array.length-1; i>=0; --i){
    if(! filter(array.createCopyRemovingElementAt(i), target)) break;
  }
  if(i==array.length-1) print(array); // solution is "optimal": could not remove a single number
  return true;
}
函数过滤器(数组,目标):布尔{//假定数组按降序排序
if(sum(array)=0;--i){
如果(!filter(array.createCopyRemovingElementAt(i),target))中断;
}
如果(i==array.length-1)打印(array);//解决方案为“最优”:无法删除单个数字
返回true;
}

低效的解决方案:复杂性=O((2^n)*n)


但即使不是最佳解决方案,它也会打印阵列。我只想打印最优的。我现在明白了。将其更改为仅打印最佳解决方案执行此操作时,我会收到StackOverflower错误:(你的数组有多大?它可以和数组中的元素数一样深。它将包含3到10个元素,测试的一个包含8个元素。它只包含2到3个元素的结果。这看起来很相似,有点相似,但如果它们相等或更大,这与我想要得到的结果不一样。我发现这个问题要困难得多。
for i = 0 to 2^size-of-array
do
   sum = 0
   for j = 0 to n-1
   do
     if(jth bit in i is 1)
     then
      sum+=array[j]
      fi
   done

  if(sum>=target)
     print the number i (uniquely identifies the set of numbers)
done