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_JUDGE
freopen("1.txt","r",stdin);
#endif
int 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;
}