'Find all ways to sum given number (with repetitions allowed) from given set
Given an array (e.g. [1,2]) of n elements and a number 'k' (e.g. 6), find all possible ways to produce the sum = k
For given example answer would be 4 because
1 1 1 1 1 1
1 1 1 1 2
1 1 2 2
2 2 2
The algorithm I could think of is by brute force, we simulate all possible scenarios, and stop when from given state we can not reach result.
arr[] = [1,2]
k = 6
globalCount =0;
function findSum(arr,k)
{
if(k ==0)
globalCount++
return
else if(k<0)
return
for each i in arr{
arr.erase(i)
tmp = k
findSum(arr,tmp)
while(k>=0){
findSum(arr,tmp -= i)
}
}
I am not sure if my solution is most efficient one out there. Please comment /correct or show pointers to better solutions.
EDIT : Would really appreciate if someone can give me runtime complexity of my code and their soln code. :) Mine code complexity I think is Big-O( n^w ) w = k/avg(arr[0]..arr[n-1])
Solution 1:[1]
This is an interesting subset of the partition problem. There's actually a closed-form solution to this (see here and here) if you allow all integers.
Doing some googling for the "restricted partition function" gave me some leads. This paper gives a pretty mathematically rigorous discussion of a couple of solutions to this problem, as does this one.
Unfortunately I'm too lazy to code these up. They're pretty intense solutions.
Solution 2:[2]
static void populateSubsetSum(int[]a,int K,int runSum,int idx,ArrayList<ArrayList<Integer>> ans,ArrayList<Integer> al){
if(idx>=a.length || runSum>K)
return;
if(runSum==K){
ans.add(new ArrayList<>(al));
return;
}
ArrayList<Integer> temp=new ArrayList<>(al);
temp.add(a[idx]);
populateSubsetSum(a,K,runSum+a[idx],idx,ans,temp);//when repitions of elements are allowed
populateSubsetSum(a,K,runSum,idx+1,ans,al);
}
Call this function as:
populateSubsetSum(a,K,0,0,ans,new ArrayList<>());//array,sum,initial_sum,global 2d list,temp list
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Glorfindel |
| Solution 2 | David Buck |
