http://acm.hdu.edu.cn/showproblem.php?pid=1342
Lotto
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3025 Accepted Submission(s): 1440
Problem Description
我们有一个游戏,从集合{1,2,3,...,49}中选择6个数来组成新的集合。现在我们有一种玩法是从这49个数字中选出k(k>6)个组成集合S,然后玩从S中选数字的游戏(选择6个数字组成新集合)。例如,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].
你的工作是写一个程序读取整数k和集合S然后打印从S中选择数字的所有可能。
Input
输入包括0或多组测试用例。对每一组用例为一行包括多个用空格隔开的整数。这一行第一个数字是k(6<k<13)然后k个按
升序排列的整数组成集合S。输入以k = 0结束。
Output
对每一组测试数据,打印所有的可能,每一种可能打印一行。每个游戏的数字必须按照
升序排序,并且彼此相隔恰好一个空格。每种可能本身必须按照字典顺序排序,这意味着按照最低的数字先排序,然后按第二个排序,依此类推,如下面的示例输出所示。测试用例之间被空行隔开,最后一个测试用例之后没有空行。
Sample Input
7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0
Sample Output
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34
//好气啊,破编译器在那一直错,样例都不对,新建一个窗口就好了,浪费我那么多时间#include<stdio.h>
#include<string.h>
int k,a[51],cnt,ans[10];
void dfs(int i,int num) //代表位置和所选个数
{
if(num==6)
{
for(int j=0;j<5;j++)
printf("%d ",ans[j]);
printf("%d",ans[5]);
printf("\n");
return;
}
if(i==k)
return ;
//选与不选,没有什么条件,所以不用if条件判断,但是选的时候要加入答案数组保存,不选的时候删掉那个加上的元素
ans[cnt++]=a[i];//选择的情况,将其加入答案数组里
dfs(i+1,num+1);
cnt--;// 不选的时候,下标减减,相当于删除前面加上的那个元素
dfs(i+1,num);
}
int main()
{
int nu=0;
while(~scanf("%d",&k))
{
if(k==0)
break;
memset(ans,0,sizeof(ans)); //注意每次都要清零
cnt=0;
for(int i=0;i<k;i++)
scanf("%d",&a[i]);
if(nu++)//注意这里,最后一个样例之后不能有多余的换行,
printf("\n");
dfs(0,0);
}
return 0;
}