完美的总和问题,允许重复

时间:2018-12-17 16:25:52

标签: arrays dynamic-programming

给定一个由整数和和组成的数组,任务是打印给定数组的所有子集,其总和等于给定和,并允许重复。

示例:

输入:arr = {1、5、6},N = 7

输出:
1 1 1 1 1 1 1
1 1 5
1 5 1
5 1 1
1 6
6 1

我已经经历了https://www.geeksforgeeks.org/perfect-sum-problem-print-subsets-given-sum/https://www.geeksforgeeks.org/ways-sum-n-using-array-elements-repetition-allowed/find all subsets that sum to a particular value

的相关DP问题。

我还没有找到一种方法或任何线索来解决允许重复的问题。任何线索都将有所帮助。

3 个答案:

答案 0 :(得分:1)

像这样吗?

function f(A, N, r=[], s=N){
  if (s == 0)
    return [r];

  result = [];

  for (let a of A)
    if (a <= s)
      result = result.concat(
        f(A, N, r.slice().concat(a), s-a));

  return result;
}

console.log(JSON.stringify(f([1,5,6], 7)));

答案 1 :(得分:0)

对输入数组进行排序(如果可以),然后使用https://en.wikipedia.org/wiki/Backtracking获得所有可能的解决方案。只需从最低的数字开始,如果它不能容纳,那么就开始返回并检查(输入数组中)高一号的物品是否适合。

答案 2 :(得分:0)

这是Java中的一个简单解决方案:

public class PrintAllSubsets {

    public static void main(String[] args) {
        int arr []= {1, 5, 6}; 
        int N = 7;
        allSubsets(arr,N,"");
    }

    private static void allSubsets(int[] arr, int n, String res) {

        if(n == 0) {
            System.out.println(res);
            return;
        }
        for(int i = 0; i<arr.length;i++) {
            if(n >= arr[i]) {
                allSubsets(arr, n-arr[i], res + arr[i]);
            }
        }
    }

}