题目分析:
抽奖
在德国乐透你需要从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? ' \n ': ' ');
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( " \n ");
for(i= 0; i<n; i++)
scanf( " %d ", &a[i]);
Find(a, n, 0);
}
return 0;
#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? ' \n ': ' ');
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( " \n ");
for(i= 0; i<n; i++)
scanf( " %d ", &a[i]);
Find(a, n, 0);
}
return 0;
}