求解幂集问题(c语言+蛮力法)
求解幂集问题
幂集是集合的基本运算之一,由集合的所有子集构成的集合。例:n=3时,幂集是:
{{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}};
若是有限集,有n个元素,那么的幂集有2^n个元素.
【问题描述】
对于给定的正整数n(n≥1),求1~n构成的集合的所有子集(幂集).
【问题求解】
●蛮力法①
采用直接蛮力法求解,将1~n的存放在数组a中,求解问题变为构造集合a的所有子集,设集合a[0…2]={1,2,3},其所有子集对应的二进制位及其十进制数如下。
<1>.对于含有n(n≥1)个元素的集合a,求幂集的过程如下:
for(i=0;i<2^n;i++)
{将i装换为二进制数b;输出b中为1 的位对应的a 元素构成一个子集;}
<2>.首先b[0…2]=000,每调用一次inc,b表示的十进制数增加1
算法如下:
void inc(int b[],int n) //将b表示的二进制数增1
{for(int i=0;i<n;i++) //遍历数组b{ if(b[i]) //将元素1改为0b[i]=0;else //将元素0改为1并退出for循环{ b[i]=1;break;}}
}
解释如下:
【完整算法代码】
#include<stdio.h>
#include<math.h>void inc(int b[],int n) //将b表示的二进制数增1
{for(int i=0;i<n;i++) //遍历数组b{ if(b[i]) //将元素1改为0b[i]=0;else //将元素0改为1并退出for循环{ b[i]=1;break;}}
}void PSet(int a[],int b[],int n) //求幂集
{ int i,j;int pw=(int)pow(2,n); //求2^nprintf("1~%d的幂集:\n",n);for(i=0;i<pw;i++) //执行2^n次 {printf(" { ");for(int k=0;k<n;k++) //执行n次 if(b[k])printf("%d",a[k]);printf(" } ");inc(b,n); //b表示的二进制数增1 }printf("\n");
}int main(){int n=3;int a[10],b[10];for(int i=0;i<n;i++){a[i]=i+1;b[i]=0;} PSet(a,b,n);
}
时间复杂度:O(n*2^n)
●增量蛮力法②
采用增量蛮力法求解1~n的幂集,当n=3是的求解过程。
这种思路也是蛮力法求解:穷举1~n的所有子集。对应的过程如下:
void f(int n) //求1~n的幂集ps
{置ps={{}}; //在ps中加入一个空子集元素for(i=1;i<=n;i++){ps1=ps;在ps1的每个子集元素中添加i;将ps1的所有元素添加到ps中;}
}
【完整算法代码】
#include<stdio.h>
#include<vector>
using namespacestd;
vector<vector<int>> ps; //用于存放幂集
void Pset(int n){vector<vector<int> > ps1; //子幂集vector<vector<int> >::iterator it; //迭代器 vector<int> s; //添加空集元素 ps.push_back(s); for(int i=1;i<=n;i++){ps1=ps; //ps1存放上一步骤得到的幂集 for(it=ps1.begin();it!=ps1.end();++it) (*it).push_back(i); //在ps1的每个集合元素末尾添加i for(it=ps1.begin();it!=ps1.end();++it)ps.push_back(*it); //将ps1的每个集合元素添加到ps中 }
}
时间复杂度:O(2^n)
求解幂集问题(c语言+蛮力法)相关推荐
- 使用蛮力法求解数字迷问题(类似ABCAB*A = DDDDDD)
蛮力法概述 蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述>和所涉及的概念定义.是基于计算机运算速度快这一特性,在解决问题时采用的一种"懒惰"的策略.把问题的所 ...
- 蛮力法求解百元买百鸡问题
蛮力法(brute force methord,也称穷举法或者枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述.所以,蛮力法也是最容易应用的方法. 蛮力法所依赖的基本技术是遍历(trav ...
- 蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题
蛮力法在求解最优解问题中的应用 1.TSP(旅行商问题)要求我们找出一条n个给定城市之间的最短路径,使我们再回到出发的城市之前,对欧每个城市都只访问一次.我们可以用赋权图来描述这个问题,那么算法的目的 ...
- 蛮力法查找有序数列c语言,算法——蛮力法之选择排序和冒泡排序c++实现
这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...
- 算法分析:采用蛮力法(循环) 求解最大连续子序列和问题。给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。 例如: 序列(-2,11,-4,13,-5,-2)
一.效果图 二.源代码 package sy4; import java.util.Scanner; /** * @author * */ public class Sy4_2 { static vo ...
- 【算法】蛮力法/穷举法/枚举法 的基本问题分析
炮兵问题的优化,设立逻辑数组 蛮力法设计思想 有策略地穷举 + 验证 制定穷举策略 避免重复 简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式.(我也不知道答案是什么 ...
- 蛮力法求最大字段和时间复杂度_蛮力法
蛮力法的主要思想就是用最简单的思路解决问题,一般性能不好,但仍然很重要. 理论上蛮力法可以解决可计算领域的各种问题 蛮力法解决较小规模问题是可接受的,如果设计一个更高效算法代价不值得 蛮力法可以作为时 ...
- 关于算法--蛮力法篇--选择排序
近日开始学习算法,所看课本为清华大学出版社的<算法设计与分析基础>,对简单的数据结构进行了复习,已经学习了算法效率分析基础. 本篇开始对所学算法的思想进行实际JS编码,看学习的进度,每日写 ...
- 蛮力法的相关问题总结
今天想写写关于蛮力法的一些问题,也给之后自己留下一个笔记. 蛮力法关键------依次处理所有元素 1.查找问题中的蛮力法 顺序查找 int SeqSearch(int r[],int n,int k ...
- 算法设计与分析-TSP六种方法-贪心算法(最近邻点、最短链接)、蛮力法、动态规划法、回溯法、分支限界法、模拟退火
旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径, ...
最新文章
- 要求学生从事教学科研无关内容,把学生当廉价劳动力的导师将被严肃处理!...
- TensorFlow – A Collection of Resources
- 【解题报告】Leecode. 575. 分糖果——Leecode每日一题系列
- 通过分区在Kafka中实现订单保证人
- vue 中 created 和 mounted 钩子生命周期 问题
- “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法...
- 百度MP3音乐API接口及应用
- Linux内核分析第一周——计算机是如何工作的
- SQL Server问题之The remote procedure call failed. [0x800706be]
- 【呆萌の研究】JavaScript常见的继承方式
- java excel 合并两个单元格内容 无法换行_12个简单高效的EXCEL小技巧,让你秒变职场达人!...
- python操作数据库的几种方法_python对mysql数据库操作的三种不同方式
- python 逻辑运算的短路问题
- python如何用requests传送json格式数据
- creator qt 字体太小_QtCreator的一些自定义代码字体和颜色
- bjui—关闭dialog以及当前标签
- MySQL图书馆借书管理系统试题
- CUDA各个版本下载网址
- js 伪数组(类数组)与数组的区别
- raspios-bullseye-arm64 系统 BUG
热门文章
- 设计模式—生成器模式(建造者模式)
- Coredump-N, segfault at 0 ip 0000000000000000 sp; 被kernel 抓到
- 计算机音乐谱魔法城堡,《魔法城堡》简谱 TFBOYS 乐谱 - 新芭网
- [转]FTP搜索引擎的设计与实现
- 计算机专业交互式教学课件制作,简易交互式课件的制作
- SPPnet论文总结
- (java毕业设计)基于jsp旅游网站管理系统源码
- 世界首例AI同性婚姻惊呆众人 | Siri和Alexa结婚了
- 大智慧c语言dll,易语言大智慧dll模板接口
- 传动系统结构简图_液压传动系统结构示意图画图技巧(攻略)