public static ArrayList<ArrayList<Integer>> subsets(int[] S) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if (S == null || S.length == 0) {
            return res;
        }

        // ascend
        Arrays.sort(S);

        int max = 1 << S.length;

        for (int i = 0; i < max; i++) {
            ArrayList<Integer> tmp = new ArrayList<Integer>();
            int j = i;

            for (int index = 0; j > 0; j >>= 1, index++) {
                if ((j & 1) == 1) {
                    tmp.add(S[index]);
                }
            }

            res.add(tmp);
        }

        return res;
    }