【发布时间】:2021-08-27 19:04:50
【问题描述】:
试图解决最佳和问题,但我没有使用 DP 得到正确答案,但如果我删除了这段代码的记忆部分,那么我得到了正确答案。
我附上输出截图:
PS:请不要评判我的代码我正在努力学习DP,我知道这个代码不是最好的。
public class BestSum {
public static void main(String[] args) {
int[] arr = { 2, 3, 4, 5 };
int num = 10;
Map<Integer, List<Integer>> map = new HashMap<>();
List<Integer> list = rec(arr, num, map);
System.out.println(list);
}
static List<Integer> rec(int[] arr, int n, Map<Integer, List<Integer>> map) {
if (n == 0) {
return new ArrayList<>();
}
if (n < 0) {
return null;
}
if (map.containsKey(n)) {
return map.get(n);
}
List<Integer> sCombo = null;
for (int i : arr) {
int rem = n - i;
List<Integer> t = rec(arr, rem, map);
if (t != null) {
List<Integer> list = new ArrayList<>();
t.add(i);
list.addAll(t);
if (sCombo == null || list.size() < sCombo.size()) {
sCombo = list;
}
}
}
map.put(n, sCombo);
return map.get(n);
}
}
【问题讨论】:
-
Best Sum是什么问题?不要假设所有人都知道这个问题。 -
对不起。给定一个由不同整数组成的数组 arr 和一个目标整数 num,返回一个最小的数字列表,并且选择的数字总和为目标。您可以按任何顺序返回组合。例如:arr = { 2, 3, 4, 5 } num = 10 输出:[5,5]
-
还是被解释和输出弄糊涂了-
[5, 5]输入的arr只有一个5!如果它允许重复使用arr中的任何数字,那么 ans.可以是 [2, 3, 5], [2, 3, 2, 3] .... -
所以你必须返回最小大小的数组,这样输出数组的每个元素的总和就是这种情况下的数字 10,你可以重用原始数组中的元素......所以即使 [2, 3,5] 和 [2,3,3,2] 之和为 10,但我们仍然可以得到最小大小的数组 [5,5] 之和为 10。
-
啊,终于明白了。希望您可以更新原始帖子的所有详细信息。