/*
m元素集合的n个元素子集
说明:
假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些? 解法:
假设有5个元素的集点,取出3个元素的可能子集如下:
{1 2 3} 、{1 2 4 } 、{1 2 5} 、{1 3 4} 、{1 3 5} 、{1 4 5} 、{2 3 4} 、{2 3 5} 、{2 4 5} 、{3 4 5}这些子集已经使用字
典顺序排列,如此才可以观察出一些规则:
如果最右一个元素小于m,则如同码表一样的不断加 1
如果右边一位已至最大值,则加1的位置往左移
每次加1的位置往左移后,必须重新调整右边的元素为递减顺序 所以关键点就在于哪一个位置必须进行加1的动作,到底是最右一个位置要加1? 还是其它的位置?在实际撰写程式时,可以使用一个变数positon来记录加1的位置,position的初值设定为n-1 ,因为我们要使用阵
列,而最右边的索引值为最大 的n-1,在position位置的值若小于m就不断加1,如果大于m 了, position就减1,也就是往左移一个
位置;由于位置左移后,右边的元素会 经过调整,所以我们必须检查最右边的元素是否小于m,如果是,则position调整回n-1,如
果不是,则positon维持不变。
*/ #include<stdio.h>
#include<stdlib.h> #define MAX 20 int main(void)
{
int set[MAX];
int m, n, position;
int i; printf("输入集合数: ");
scanf("%d", &m);
printf("输入取出元素 n:");
scanf("%d", &n); for(i = ; i < n; i++)
{
set[i] = i + ;
} for(i = ; i < n; i++)
{
printf("%d", set[i]);
}
putchar('\n'); position = n - ; while()
{
if(set[n - ] == m)
{
position--;
}
else
{
position = n - ;
}
set[position]++;
for(i = position + ; i < n; i++)
{
set[i] = set[i - ] + ;
}
for(i = ; i < n; i++)
{
printf("%d", set[i]);
}
putchar('\n');
if(set[] >= m - n + )
{
break;
}
} return ;
}

运行结果:

最新文章

  1. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
  2. HTML5应用缓存机制
  3. Front End Developer Questions 前端开发人员问题(二)CSS 后续
  4. sqlServer 2008修改字段类型和重命名字段名称的sql语句
  5. POJ3254Corn Fields(状态压缩DP入门)
  6. Microsoft SQL Server 2008 安装图解(Windows 7)
  7. 2014-08-29 Last Day
  8. 解密随机数生成器(二)——从java源码看线性同余算法
  9. IOS 原生解析JSON 问题
  10. CentOS7.2 初始化
  11. Lua内存分析工具
  12. VS2010每次调试都出现“此项目已经过期”提示
  13. Java将网络地址对应的图片转成本地的图片
  14. Java架构师技能发展脑图
  15. C++指针和字符串
  16. 2016年3月16日Android学习笔记
  17. Java 中位移运算符 &gt;&gt;,&gt;&gt;&gt;,&lt;&lt;
  18. Xcode6.1 模拟器路径
  19. Oracle EBS 导入日记账报错
  20. 【Java】 用PriorityQueue实现最大最小堆

热门文章

  1. Windwos下 php mysql apache 环境配置
  2. ICE BOX 配置,使用----第一篇
  3. mustache.js基本使用(一)
  4. STM32-NVIC中断管理实现[直接操作寄存器]
  5. LED调光,PFM即pulse frequence modulation
  6. 单片机裸机下写一个自己的shell调试器
  7. FZU 1063 三维扫描
  8. BZOJ2733 [HNOI2012]永无乡 【线段树合并】
  9. 在MVC中添加拦截器实现登录后的权限验证
  10. selenium Chromediver