给定一个由整数和和组成的数组,任务是打印给定数组的所有子集,其总和等于给定和,并允许重复。
示例:
输入: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问题。我还没有找到一种方法或任何线索来解决允许重复的问题。任何线索都将有所帮助。
答案 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]);
}
}
}
}