1144: 组合的输出

来源:互联网 发布:觉得自己很透明知乎 编辑:程序博客网 时间:2024/05/22 13:20

1144: 组合的输出

Description

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 现要求你不用递归的方法输出所有组合。 例如n=5,r=3,所有组合为: l 2 3 l 2 4 1 2 5 l 3 4 l 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

Input

一行两个自然数n、r(1< n < 21,1<= r <=n)。

Output

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

Sample Input

5 3


对于STL排列函数next_permutation(a , a + n)的应用 

n 为选取 n 个数进行排列求下一个排列,且下一个排列比当前大但按字典序是最小的排列

例如:例题选取下标 3 4 5 作为标记 1 ,其余为 0 。则我们可以先输出排列数为 0 的(下标数 +1)   (0 + 1 =)1   (1 + 1 = )2   (2 + 1 = )3 (即当前数组为 0 0 0 1 1 1

输出后进入排列。。可以排列出的数字为 0 0 1 0 1 1,因为作为数字看001011  比未排前的大但却又是最小。

因此,根据数组里数字为 0 的数,可以输出其下标加 1 ,然后继续循环


#include<cstdio>#include<cstring>#include<iostream>#include<utility>#include<string>#include<vector>#include<algorithm>#include<queue>#include<cstdlib>#include<cmath>#include<stack>using namespace std;int main(){#ifndef ONLINE_JUDGEfreopen("1.txt","r",stdin);#endifint n , m , a[25];cin >> n >> m ;memset(a,0,sizeof(a));for(int i = n; i >= m ; i--){a[i]=1;}do{for(int i = 0; i < n; i++){if(!a[i]){printf("%3d",i+1);}}cout << endl;}while(next_permutation(a , a + n));return 0;}


0 0
原创粉丝点击