public void dfs(int index, int sum) {
        if (sum > target) return;
        
        if (sum == target) {
            StringBuilder key = new StringBuilder();
            ArrayList<Integer> result = new ArrayList<Integer>();
            for (int i=0; i<st.size(); i++) {
                result.add(st.get(i));
                key.append(st.get(i));
                key.append(',');
            }
            String keystr = key.toString();
            if (!unicheck.contains(keystr)) {
                results.add(result);
                unicheck.add(keystr);
            }
        } else {
            if (index >= num.length) return;
            
            if (index+1 < num.length && sss[index+1] >= target-sum) dfs(index+1, sum);
            st.push(num[index]);
            if (index+1 < num.length && sss[index+1] >= target-sum-num[index]) dfs(index+1, sum+num[index]);
            st.pop();
        }
    }