求集合中M个元素构成的子集问题

算法思想:   集合中的某个元素,要么在子集中,要么不在子集中;

                    每次从集合中取一个元素,将该元素放在子集中,如果子集中的元素个数等于M,

                    则输出集合中的元素,否则继续取舍;将该元素从子集中删除,继续取舍直到集合尾部;


C#实现:

/// <summary>
       /// 求集合中的M个元素构成的子集
       /// </summary>
       /// <param name="a">集合</param>
       /// <param name="i">已对集合中的第i-1个元素取舍</param>
       /// <param name="m">子集元素的个数</param>
       /// <param name="n">集合元素的个数</param>
       /// <param name="b">临时集合,用来输出子集</param>
       void PowerSetMFromN(int[] a, int i, int m, int n, List<int> b)
       {
           if (i <= n)
           {
               int x = a[i - 1];
               b.Add(x); //取

               if (b.Count == m) //元素个数等于子集中要求的个数,输出
               {
                   Console.Write(" { ");

                   for (int j = 0; j < b.Count; j++)
                   {
                       if (j < (b.Count - 1))
                           Console.Write(b[j] + " , ");
                       else
                           Console.Write(b[j] + " } ");
                   }

                   Console.WriteLine();
               }
               else
               {
                   PowerSetMFromN(a, i + 1, m, n, b);
               }

               b.Remove(x); //舍
               PowerSetMFromN(a, i + 1, m, n, b);
           }
       }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值