这道题前面做了这么多铺垫,然后给我一个长为N的序列,其中有H个1,剩余的是0,要我们按
字典序输出该序列的可重集排列,因为昨天刚学会用C++的库函数,我先用Next_permutation函
数写了一遍,代码很简洁。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int num[20];
int main()
{
int T;
scanf( "%d", &T);
int len, n;
while( T --)
{
scanf( "%d%d", &len, &n);
for( int i = 0; i < len; i ++)
{
if( i < len - n) num[i] = 0;
else num[i] = 1;
}
do
{
for( int i = 0; i < len; i ++)
printf( "%d", num[i]);
printf( "\n");
}while( next_permutation( num, num + len) );
if( T > 0) printf( "\n");
}
return 0;
}
之后写了一遍不用库函数的:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 20
int P[MAXN], A[MAXN], N, H;
void print_permutation( int N, int *P, int *A, int cur)
{
if( cur == N){
for( int i = 0; i < N; i ++)
printf( "%d", A[i]);
printf( "\n");
}
else for( int i = 0; i < N; i ++)
if( !i || P[i] != P[i - 1])
{
int c1 = 0, c2 = 0;
for( int j = 0; j < cur; j ++) if( A[j] == P[i]) c1 ++;
for( int j = 0; j < N; j ++) if( P[i] == P[j]) c2 ++;
if( c1 < c2)
{
A[cur] = P[i];
print_permutation( N, P, A, cur + 1);
}
}
}
int main()
{
int T;
scanf( "%d", &T);
while( T --)
{
scanf( "%d%d", &N, &H);
for( int i = 0; i < N; i ++)
{
if( i < N - H) P[i] = 0;
else P[i] = 1;
}
print_permutation( N, P, A, 0);
if( T > 0) printf( "\n");
}
return 0;
}
浙公网安备 33010602011771号