我们可以使用递归的方式来解决这个问题。
具体来说,我们可以使用一个函数来处理从数组的第 $i$ 个位置开始,取 $r$ 个数的组合情况。我们先将当前位置的数字加入组合中,然后递归调用函数,处理从 $i+1$ 位置开始,取 $r-1$ 个数的组合情况。然后我们再将当前位置的数字从组合中删除,递归调用函数,处理从 $i+1$ 位置开始,取 $r$ 个数的组合情况。
在处理组合的时候,我们需要注意一些细节。首先,我们需要将组合按照字典序的顺序排序,这样才能满足输出的顺序要求。其次,我们需要在输出组合之前,将组合中的数字按照从大到小的顺序排序。这样,我们就可以使用如下的代码来解决这个问题:
``` void combine(int a[], int i, int n, int r, vector &comb) { if (r == 0) { // 输出当前组合 sort(comb.begin(), comb.end(), greater ()); // 按照从大到小的顺序排序 for (int j = 0; j < comb.size(); j++) { cout << comb[j] << " "; } cout << endl; return; } if (i == n) { return; } // 不取当前位置的数字 combine(a, i+1, n, r, comb);