我假设一种情况吧:
int[] arr={35,47,26,18,14,35,98,52,48,23,49,32}
假如我需要一个数:360
我现在想知道,上面数组里面的哪几个数相加能大于350
但是所有加起来大于350的组合里数据个数是最少的
需要算法优化,遍历所有情况耗费太大
将 数组 int[] arr={35,47,26,18,14,35,98,52,48,23,49,32} 进行 由大到小的排序,
那么 从头遍历 累计,累加和 第一大于350 的数据 即符合条件的数据。
排序数据,循环数据个数 按照数据个数二分查找
思路:要个数最少,所以需要最大的数相加才是最少的个数,先排序,然后在做累加,判断,代码如下:
Arrays.sort(arr);
int total = 0;
List<Integer> res = new ArrayList<>();
for(int i=arr.length-1;i>=0;i--){
res.add(arr[i]);
if((total += arr[i])>350){
break;
}
}
System.out.println(total);
System.out.println(res);