从的整数中选出个,输出所有的选择方案。
输出格式:对于每种方案,从小到大空格隔开;对于不同的方案,字典序升序输出。
5 3
xxxxxxxxxx1 2 31 2 41 2 51 3 41 3 51 4 52 3 42 3 52 4 53 4 5
类似于递归实现指数型枚举,我们只需要在选取数量恰好是的时候再输出就行了。
但是需要注意的是,数据范围变成了25。所以需要剪枝,即在已经不可能达到最终结果的时候提前退出递归。
这一题如果选取的元素已经大于个了,就不可能正好选个了,就需要退出。同理,如果所选元素的个数加上剩下的所有元素也达不到,也需要退出。
如果把上一题的代码直接搬过来,加上剪枝,就是:
运行会发现结果是倒序的,大的结果在前面
xxxxxxxxxx3 4 52 4 52 3 52 3 41 4 51 3 51 3 41 2 51 2 41 2 3
这是由 我们先不选第个元素再选第个元素 造成的。
xxxxxxxxxxcalu(x+1);v.push_back(x);calu(x+1);v.pop_back();而第个元素是比较小的(从小到大递归),本来应该在前面才对。
所以我们只需要调整一下push和pop的顺序即可。
xxxxxxxxxxv.push_back(x);calu(x+1);v.pop_back();calu(x+1);总的就为: