【问题标题】:Getting wrong answer while trying to solve Best sum problem using Dynamic programming尝试使用动态编程解决最佳和问题时得到错误答案
【发布时间】: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。
  • 啊,终于明白了。希望您可以更新原始帖子的所有详细信息。

标签: java dynamic-programming


【解决方案1】:

list.add(i); // 用这个代替 t.add(i)。

代码中的一个小错误没有别的。

【讨论】:

    【解决方案2】:

    只是一个小错误,即...... 您直接将 sCombo 插入到地图中。 sCombo 数组中的值在每次递归时都在变化,同时映射中相同的 sCombo 数组值也在变化,因为每个 sCombo 数组只有一个内存块,这意味着当我们编辑该 sCombo 数组时,它会影响以前的结果....

    示例:- 您将列表分配给 sCombo sCombo=列表;

    当列表发生变化时,sCombo 也会发生变化

    只需 clone() 对象,你就会得到这样的正确结果......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多