问题描述:分割集合成多个子集合,这几个子集合间没有交集且他们的并集是原集合。
       思路:将包含n个元素的集合set的分割表示为n个数字。比如set[]={1,2,3,4},那么{1,2},{3,4}就可以表示为1122,这4个数分别表示set[0]在第一个分割集合,set[1]在第一个分割集合,set[2]在第二个分割集合,set[3]在第二个分割集合。将这个过程称为编码。
       然后抓住两个要点:
       1.第i个元素的编码一定小于或者等于i。约定一下,set原集合已经从小到大排列好,分割的集合也是这样排好。然后,很容易理解,第1个元素的编码肯定为1。接着,第2个元素如果在第一个分割集合中,那么他的编码也是1;但如果不是在第一个分割集合中,那么第2个元素的编码肯定是2,因为在第二个分割集合中,最小的数最少也是2;依次类推,可以很容易用数学归纳法证明。
       2.第i个元素的编码一定小于等于1,2,3,....i-1这些元素的编码中的最大值再加1。这也很容易想到,也很容易用数学归纳法证明。
       抓住这个要点后,就用深度搜索构造一颗子集合树就可以解决问题了。但是,我在构造子集树的过程中出现了一个思维上的错误,导致浪费了不少调试的时间。具体的错误见代码注释的描述。
       代码如下:
 1 #include <stdio.h>
 2 #define MAX 1000
 3
 4 int set[MAX]={1,2,3,4};
 5 int n=4;
 6 int code[MAX]={1,1,1,1};
 7
 8 //prototype
 9 void DFS(int index);
10
11 void print_set()
12 {
13     int index;
14     int max=-1;
15     printf("{");
16     for(index=0;index<n;index++)
17     {
18         if(code[index]==1)
19             printf("%d ",set[index]);
20         if(max<code[index])
21             max=code[index];
22     }
23     printf("},{");
24     for(index=2;index<=max;index++)
25     {
26         int index_2;
27         for(index_2=0;index_2<n;index_2++)
28             if(code[index_2]==index)
29                 printf("%d ",set[index_2]);
30         printf("},{");
31     }
32     printf("\n");
33 }
34
35 //find out the max code of 1,2,3...i-1 and plus 1
36 int max_pre(int i)
37 {
38     int index;
39     int max=-1;
40     for(index=0;index<i;index++)
41         if(code[index]>max)
42             max=code[index];
43     return (max+1);
44 }
45
46 int main()
47 {
48     int i;
49     DFS(1);
50     return 0;
51 }
52
53 void DFS(int index)
54 {
55     print_set();
56     if(index==n)
57         return ;
58     for(;index<n;index++)
59     {
60         int temp=code[index]+1;
61         //在写这里的代码时,我出现了一个思维上的误区:在回溯时我只顾把code[index]++,而没有将code[index]在2到max_pre(index)遍历,这导致了我调试了挺长时间。
62         for(;temp<=index+1 && temp<=max_pre(index);temp++)
63         {
64             int save=code[index];
65             code[index]=temp;
66             DFS(index+1);
67             code[index]=save;
68         }
69
70     }
71
72 }

参考资料:《C语言名题精选百则技巧篇》
如果你觉得我的文章对你有帮助,请赞一下,非常感谢!

转载于:https://blog.51cto.com/neilhappy/1127670

集合的所有分割方式---2013年1月28日相关推荐

  1. 关于 写代码 2013年9月28日18:22:43

    其实 写代码真的不是很难 代码的错误 来源于 两个方面: 1 = 自己没有想清楚 2 = 来源于自己的不专注: 代码 写 全神贯注的写: 要么就一个标点符号也不写 !!!!!! 2013年9月29日1 ...

  2. 无限式查找-----2013年2月28日

    问题描述:已知一个数组x[],元素个数有多少并不很清楚,但是数组元素已经依顺序从小到大排好,而且在数组最后添加了足够多的MAX记号;MAX表示最大的值,比数组中每一个元素都大,而且个数足够多.编写一个 ...

  3. 2013年2月28日星期四

    今天2月最后一天,主要解决web客户端本地图片预览问题,用到IE的滤镜来实现,注意点是IE8及IE9下获取用户选择文件路径的方法.在实现时犯过不少小错误,注意到js的灵活而不严谨:想让一个对象获取焦点 ...

  4. 2013年7月28日web前端学习笔记-------head相关标签应用

    7月份快过完了.趁周日写写学过觉得有用的东西. 1.缩略图的展示问题,不要以为缩略图设置了width,height,就是缩略图了.比如一个300kb的500*500原始图片,用户请求web服务器后,展 ...

  5. 2013年8月28日、PS初步入门|and|Maven了解

    今儿高兴. 财神爷生日.Ivan老师新婚开乐哈. 因帮奥迪师兄Ps照片知道自己这方面的不足.今天和静师姐学习ps图片的基础入门. 哈哈.静师姐的大学母校也在长春.很亲切.我们聊了很多.也知道了.美工的 ...

  6. 2013年最后2个月的学习目标(成果)(上次更新2013年11月18日)

    1.2013年11月7日. a.新人毕业-老人跳槽 专栏. 简化标题,调整字体,增加和修改"相关阅读". 增加和修改Tag. b.新人毕业-老人跳槽 专栏. 删除3篇非原创文章. ...

  7. 2013年期中总结 2013年9月10日20:17:49

    题目中的时间,我改了几次,一直在想这半年来的经历,我想我是成长着的吧! 继上次总结<2012年年度总结   2013年2月25日21:49:44>,眨眼过去了半年,细细想来这半年来的重头戏 ...

  8. 2013年12月30日 星期一 谷歌、百度地图拽取

    2013年12月30日 星期一 17:12:33 晴 by Again 2013-12-30 17.12.38 先说名几句题外话: 第一,由于需要我也是半路出家,所以多专业就谈不上了.说白了js和用到 ...

  9. 2013年5月18日华东数据库技术大会演讲嘉宾和演讲主题等信息

    [导读] 自2009年于上海举办技术类会议以来,一直坚持公益性且技术干货为主的特点,在2009年致2011年底之间的三年期间一直是IT168坚持真诚奉献,后因公司被收购等因素不得不放弃华东地区的免费技 ...

最新文章

  1. PostgreSQL 常用命令
  2. java8 LocalDate 日期比较大小
  3. d3.js中点可以用图片吗_结论第16课——抛物线的中点弦斜率
  4. c#用canny算子做边缘提取_机器视觉学习(三)边缘检测
  5. 牛客网【每日一题】4月22日 K-th Number
  6. php教程哪个软件好,写php用哪款软件好?解决方法
  7. 模拟Struts2实现
  8. Delphi clientdataset的详细介绍
  9. Retroifit原理
  10. Mongodb2.6升级到Mongodb3.0.2笔记
  11. Centos下nfs+rpcbind实现服务器之间的文件共享
  12. 设计模式之工厂模式类图
  13. 华为EC6108V9C/ E6108V9强刷固件及教程
  14. layui导入模板数据_使用layui模板填充页面数据
  15. 狗年拜年php源码,2018新年拜年贺词【2018狗年拜年贺词】
  16. mkv linux 封装字幕,【多媒体封装格式详解】---MKV【1】
  17. 【云真机平台】稳定性测试方案
  18. MediaSession和MediaSessionService的交互流程梳理
  19. VB中ByVal与ByRef有什么区别
  20. Java初级面试笔记

热门文章

  1. 遍历mysql大表的小技巧
  2. [DBNETLIB][ConnectionOpen(connect()).]SQL Server 不存在或拒绝访问解决方
  3. MySQL(二):MySQL性能优化
  4. 《我的世界》AI大战降临:6000万帧超大数据集已发布,NeurIPS 19向你约战
  5. 亚马逊自动驾驶小车上线啦:才卖1700元,请叫它“强化学习玩具”
  6. NLG ≠ 机器写作 | 专家专栏
  7. 超火的漫画线稿上色AI出新版了!无监督训练,效果更美好 | 代码+Demo
  8. 一文看尽科大讯飞年度发布会:医疗,是这家A股AI公司的新赛道
  9. 下个乳业蓝海风口 竟很可能是低温鲜奶?
  10. 闭包会造成内存泄漏吗?