public class Solution {
public
ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int
target) {
ArrayList<ArrayList<Integer> > result = new
ArrayList<ArrayList<Integer> >();
Arrays.sort(num);
int
len = num.length;
if(len > 0
&& num[0] <= target){
ArrayList<ArrayListWithSum> alist = new
ArrayList<ArrayListWithSum>();
alist.add(new
ArrayListWithSum(new
ArrayList<Integer>(), 0));
int
index = 0;
while(index < len && !alist.isEmpty()){
ArrayList<ArrayListWithSum> temp = new
ArrayList<ArrayListWithSum>();
int
theSame = checkSame(num, index);
while(!alist.isEmpty()){
ArrayListWithSum temp1 = alist.remove(0);
ArrayList<Integer> toBeAdded = new
ArrayList<Integer>();
for(int
j = 0; j < theSame - index + 1; ++j){
ArrayList<Integer> templist = new
ArrayList<Integer>();
templist.addAll(temp1.li);
templist.addAll(toBeAdded);
if(temp1.sum + j * num[index] < target)
temp.add(new
ArrayListWithSum(templist, temp1.sum + j * num[index]));
else
if(temp1.sum + j * num[index] == target)
result.add(templist);
toBeAdded.add(num[index]);
}
}
alist = temp;
index = theSame;
}
}
return
result;
}
public
static int checkSame(int[] arr, int
i){
int
len = arr.length;
int
j = i;
for(; j < len; ++j){
if(arr[j] != arr[i])
break;
}
return
j;
}
}
class
ArrayListWithSum{
ArrayList<Integer> li;
int
sum;
ArrayListWithSum(ArrayList<Integer> li, int
sum){
this.li = li;
this.sum = sum;
}
}