当前位置: 首页 > 知识库问答 >
问题:

动态规划-打印具有给定和的所有子集

米承嗣
2023-03-14

我正在练习一些动态规划问题,并试图解决用给定的和打印所有子集的问题。例如:对于集:{1,2,3,4,5}总和值=10,我应该得到以下结果:

[1, 2, 3, 4]
[1, 4, 5]
[2, 3, 5]

我在不使用表的情况下得到了所需的结果,我使用表来防止重复调用相同的表和求和。但是,当使用表时,我在输出中没有得到[2,3,5]

    private static void printSubsetsWithSum(int i, int arr[], int sum, List<Integer> list, int j, boolean[][] table, Map<String,Integer> map) {
        if(sum == 0) {
            System.out.println(list);
        } else if(sum < 0 || i >= arr.length) {
            return;
        } else if(table[i][sum]) {
            return ;
        } else if(arr[i] > sum) {
            printSubsetsWithSum(i+1, arr, sum, list, j, table, map);
            table[i][sum] = true;
            map.put( sum + "_" + i + "_" + arr[i], map.getOrDefault(sum + "_" + i + "_" + arr[i], 0) + 1);
        } else {
            list.add(arr[i]);
            printSubsetsWithSum(i+1, arr, sum-arr[i], list, j+1, table, map);
            list.remove(j);
            printSubsetsWithSum(i+1, arr, sum, list, j, table, map);
            map.put( sum + "_" + i + "_" + arr[i], map.getOrDefault(sum + "_" + i + "_" + arr[i], 0) + 1);
            table[i][sum] = true;
        }
    }

    public static void printSubsetsWithSum(int sum, int[] arr) {
        boolean table[][] = new boolean[arr.length][sum+1];
        Map<String,Integer> map = new LinkedHashMap<String,Integer>();
        printSubsetsWithSum(0, arr, sum, new ArrayList<>(), 0, table, map);
        System.out.println(map);
    }

    public static void main(String[] args) {
        printSubsetsWithSum(10, new int[] {1,2,3,4,5});
    }

请帮忙!

共有1个答案

秦才
2023-03-14
private static void printSubsetsWithSum(int i, int arr[], int sum, List<Integer> list, int j, boolean[][] table, Map<String,Integer> map) {
    if(sum == 0) {
        System.out.println(list);
    } else if(sum < 0 || i >= arr.length) {
        return;
    } else if(table[i][sum]) {
        return ;
    } else if(arr[i] > sum) {
        printSubsetsWithSum(i+1, arr, sum, list, j, table, map);
        table[i][sum] = true;
        map.put( sum + "_" + i + "_" + arr[i], map.getOrDefault(sum + "_" + i + "_" + arr[i], 0) + 1);
    } else {
        list.add(arr[i]);
        printSubsetsWithSum(i+1, arr, sum-arr[i], list, j+1, table, map);
        list.remove(j);
        printSubsetsWithSum(i+1, arr, sum, list, j, table, map);
        map.put( sum + "_" + i + "_" + arr[i], map.getOrDefault(sum + "_" + i + "_" + arr[i], 0) + 1);
        table[i][sum] = true;// <<---- remove this line it works
    }
}

该行将表[4][5]标记为true,i=4,list=[2,3]sum=5将匹配表[i][sum==true

 类似资料:
  • 我有一个子集问题的工作代码,如果它发现一个子集等于所需的目标,它可以打印数字。 > 我想打印给定目标的所有可能的子集,我不知道要为此更改什么。 我如何让它对负数起作用?

  • 以下是一个采访问题。 您将获得一个二叉树(不一定是BST),其中每个节点都包含一个值。设计一个算法来打印所有总计为该值的路径。注意,它可以是树中的任何路径-它不必从根开始。 虽然我能够找到树中从根开始的所有路径都有给定的总和,但对于不是从根开始的路径,我无法这样做。

  • 我正在练习动态编程,我正在努力调试我的代码。这个想法是在给定一组数字的情况下找出求和是否可能。这是我的代码: 以下是输出: 据我所知,在我的fe语句中,算法应该向上1行,然后查看x和y的差异并检查该槽是否可能。例如,在最明显的情况下,最后一行的最后一个元素。那将是10(y)-11(x),它应该一直回到它上面一行的索引1,我们知道这是True。不完全确定我做错了什么,如果能帮助理解这一点,将不胜感激

  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 给定一个大小为N的非负整数的未排序数组,找到一个与给定数S相加的连续子数组。 输入: 输入的第一行包含一个整数T,表示测试用例的数量。接下来是T测试用例。每个测试用例由两行组成。每个测试用例的第一行是N和S,其中N是数组的大小,S是和。每个测试用例的第二行包含N个表示数组元素的空格分隔整数。 输出: 对于每个测试用例,在新行中,如果sum等于子数组,则从左侧打印第一个出现子数组的开始和结束位置(1

  • 在研究硬币更换问题后,我尽力实施解决方案。到目前为止,我的代码打印了给定金额所需的最低硬币数量。然而,它并不打印出每种硬币面额所需的数量。这是我的代码目前的样子: 我只是很困惑如何/在哪里填充numOfCoins[]。