poj2245

题目分析:
抽奖
在德国乐透你需要从49个数(1,2,3......49)里面选择6个数,玩德国乐透一个流行的策略-尽管他不会增加你获奖的机会-选择一个子集S包含k(k>6)个数从这49个数字里面选择,然后从这S个数里面选择,例如K=8并且S={1,2,3,5,8,13,21,34}有28种可能。[1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ... [3,5,8,13,21,34]. 
你的工作就是找出来所有的可能
好吧,我是想到了深搜- -
也应该是分治策略。
*************************************************************************************************************
#include<stdio.h>

#define maxn 100

int f[maxn];

void Find(int a[], int N, int k)
{
    int i;

    if(k == 6)
    {
        for(i=0; i<6; i++)
            printf("%d%c", f[i], i==5?' ':' ');
        return ;
    }

    for(i=0; i<N; i++)
    {
        f[k] = a[i];
        Find(a+i+1, N-i-1, k+1);
    }
}

int main()
{
    int n, k=0;

    while(scanf("%d", &n), n)
    {
        int i, a[maxn];

        if(k++)printf(" ");

        for(i=0; i<n; i++)
            scanf("%d", &a[i]);


        Find(a, n, 0);
    }

    return 0;

} 

原文地址:https://www.cnblogs.com/liuxin13/p/4383988.html