子集树--组合问题(ZOJ1089Lotto)

子集树--组合问题(ZOJ1089Lotto)
与排列相比,组合是不区分元素顺序的,为了消去相同元素不同顺序的干扰项,在 选取每一个组合项的元素时使该元素的位序大于已选好元素的位序即可。如果题目要求所有组合项按升序输出,只需事先将所有元素排序即可。

#include<stdio.h>
#include
<stdlib.h>
#define LENL 6
#define LEN 15
int K;
int S[LEN];
int S1[LEN];
int cmp(const void *a, const void *b)
{
    
int *a0 = (int*)a;
    
int *b0 = (int*)b;
    
return *a0 - *b0;
}

void Arrange(int now, int last)
{
    
int i, j;
    
if(now == LENL)
    
{
        
for(i = 0; i < LENL - 1; i++)
            printf(
"%d ", S1[i]);
        printf(
"%d\n", S1[i]);
    }

    
else
        
for(i = last; now + K - i >= LENL; i++)
        
{
            S1[now] 
= S[i];
            Arrange(now 
+ 1, i + 1);    
        }

}

int main()
{
    
int i, j;
    scanf(
"%d"&K);
    
int gard = 0;
    
while(K != 0)
    
{
        
for(i = 0; i < K; i++)
            scanf(
"%d"&S[i]);
        qsort(S, K, 
sizeof(int), cmp);
        
if(gard != 0)
            putchar(
10);
        Arrange(
00);
        gard
++;
        scanf(
"%d"&K);
    }

}
 

你可能感兴趣的:(子集树--组合问题(ZOJ1089Lotto))