Lotto

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或多组测试用例。对每一组用例为一行包括多个用空格隔开的整数。这一行第一个数字是k6<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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值