【问题标题】:Perfect Sum Problem with repetitions allowed允许重复的完美和问题
【发布时间】:2018-12-17 16:25:51
【问题描述】:

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

例子:

输入: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问题

我还没有找到关于如何在允许重复的情况下解决这个问题的方法或任何线索。任何线索都会有所帮助。

【问题讨论】:

  • 查找计数是 DP 问题,而查找所有有效模式将成为 libik 回答的回溯问题。
  • 您使用哪种语言?
  • 我通常更喜欢用java,为什么?

标签: arrays dynamic-programming


【解决方案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)));

【讨论】:

  • 如果你使用可读的变量名和括号会更有帮助
  • @SudhirN 哦,对不起 - s:当前总和; N:目标总和; aA 的元素; A:给定数组; r:结果。不知道你所说的有用括号是什么意思。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个简单的 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]);
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      相关资源
      最近更新 更多