- 递归获取最优组合,条件满足直接返回,条件不满足,获取所有组合,最好使用TreeMap作为返回集合,会根据key进行排序,key重复会被覆盖原有value
private Map<Integer, List<Integer>> GreedyAlgorithmRecursion(int total, List<Integer> valueList, Map<Integer, List<Integer>> resultMap) {
//如果查询集合长度为0,或者返回结果集合中已有满足条件的 直接返回
if (valueList.size() == 0 || resultMap.containsKey(total)) {
return resultMap;
}
int result = 0;
List<Integer> list = new ArrayList<>();
int temp = total;
//从后往前循环 值比较大的优先组合
for (int i = valueList.size() - 1; i >= 0; i--) {
if (temp >= valueList.get(i)) {
temp -= valueList.get(i);
if (temp >= 0) {
list.add(i);
result += valueList.get(i);
}
}
}
resultMap.put(result, list);
//递归查询其他组合 递减截取集合
return GreedyAlgorithmRecursion(total, valueList.stream().limit(valueList.size() - 1).collect(Collectors.toList()), resultMap);
}