回溯法求集合的幂集
2015-08-11 11:02
204 查看
集合的幂集是由这个集合的元素组成的原集合的子集,例如集合{1,2,3}的幂集为:
{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。
回溯法的思路是按照某种规则对解空间进行遍历,由回溯法来求集合的幂集非常简单,此问题的解即判断在某个子集中是否加入某个元素,例如解{1,3}将1,3加入,而2不加入,可以将问题的解空间定义为如下一颗状态树:
![](http://img.blog.csdn.net/20150811105346433)
红色的直线表示是否加入1,左子树表示加入1,右子树表示不加入1,同样绿色的直线表示是否加入2,左子树表示加入2,右子树表示不加入2,以此类推。
在算法实现过程中可以使用一个结果数组 res[]来表示在某次遍历过程中元素的加入情况,res[i]=0表示不加入元素,res[i]=1表示加入元素,检查完所有元素后打印结果。
算法实现如下:
参考:http://www.cnblogs.com/hustcat/archive/2008/04/09/1144645.html
{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。
回溯法的思路是按照某种规则对解空间进行遍历,由回溯法来求集合的幂集非常简单,此问题的解即判断在某个子集中是否加入某个元素,例如解{1,3}将1,3加入,而2不加入,可以将问题的解空间定义为如下一颗状态树:
红色的直线表示是否加入1,左子树表示加入1,右子树表示不加入1,同样绿色的直线表示是否加入2,左子树表示加入2,右子树表示不加入2,以此类推。
在算法实现过程中可以使用一个结果数组 res[]来表示在某次遍历过程中元素的加入情况,res[i]=0表示不加入元素,res[i]=1表示加入元素,检查完所有元素后打印结果。
算法实现如下:
[code]#include <stdio.h> #include <stdlib.h> //递归遍历,检查所有元素,t表示要检查的元素的下标 void set_t(int a[],int res[],int t,int len){ if(t==len){ int i; printf("{ "); for(i=0;i<len-1;i++){ if(res[i]==1) printf("%d ",a[i]); } if(res[i]==1){ printf("%d }\n",a[i]); }else{ printf(" }\n"); } }else{ res[t] = 1; //加入此子集 set_t(a,res,t+1,len); res[t] = 0; //不加入此子集 set_t(a,res,t+1,len); } } void power_set(int a[],int len){ int* res = (int*)malloc(sizeof(int)*len); set_t(a,res,0,len); } int main(){ int a[] = {1,2,3,4}; power_set(a,4); return 1; }
参考:http://www.cnblogs.com/hustcat/archive/2008/04/09/1144645.html
相关文章推荐
- iOS蓝牙开发入门04--服务和特征
- iOS 9 分屏多任务(3):画中画(PiP)快速入门
- 对象和类的的关系
- [EventBus源码解析] 初探EventBus
- Ubuntu 14.10 下安装Ambari 问题汇总
- SVG实战开发学习(七)——文字与声音
- hdu2594 KMP
- 安装Windows 10商店应用而不切换至微软账户的两种方法
- Ubuntu 64 + IntelliJ IDEA + Genymotion 搭建Android开发环境
- svn简易操作
- hdoj畅通工程
- 在线画时序图的工具:Web Sequence Diagrams ,支持实时生成预览图
- [leetcode-101]Symmetric Tree(c++)
- codeforce #200 div2 的水题三道
- HDU_3172_VirtualFriends
- 算法竞赛入门经典: 第四章 函数与递归 4.6解二元一次方程
- Android AnimationDrawable动画与APP启动引导页面
- 浅谈信息无障碍人才的培养
- [ Tomcat ] 自动更新脚本
- Android 5.0 API新增和改进