计算机算法设计与分析——蛮力法

蛮力法所依赖的基本技术是遍历技术,采用一定的策略将待求解问题的所有元素依次处理一次,从而找到问题的解。

大问题:f(i,n)用于添加i~n整数(共添加n-i+1个整数)产生的幂集ps。
小问题:f(i+1,n)用于添加i+1~n整数(共添加n-i个整数)产生的幂集ps。

f(1,n)就是生成1~n的整数集合对应的幂集ps。
f(i,n,p)=输出幂集p 当i>n时
f(i,n,p)=将整数i添加到p中原有每个子集中产生新子集;并将所有新子集加入到p中;f(i+1,n,p);

void PSet(int i,int n)//求1~n的幂集ps
{
	if(i<=n)
	{
		Inserti(i);//将i插入到现有子集中产生新子集
		PSet(i+1,n);//递归调用
	}
}
vector<vector<int>> ps;//存放幂集
void Inserti(int i)
//向幂集ps中每个集合元素添加i并插入到ps中
{
	vector<vector<int>> ps1;//子幂集
	vector<vector<int>>::iterator it;//幂集迭代器
	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中
}

大问题:f(i,n)用于添加i~n整数(共添加n-i+1个整数)产生的全排列ps。
小问题:f(i+1,n)用于添加i+1~n整数(共添加n-i个整数)产生的全排列。

f(i,n)=产生全排列ps 当i>n时
f(i,n)=置ps为{{1}},取出ps的每个集合元素s,在s的每个位置插入i;将插入i后的新集合元素添加的ps1中;置ps=ps1;f(i+1,n);

void Perm(int i,int n)
//求1~n的全排列ps
{
	vector<vector<int>>::iterator it;//全排列迭代器
	if (i <= n)
	{
		vector<vector<int>> ps1;//临时存放子排列
		for (it = ps.begin(); it != ps.end(); ++it)
			Insert(*it, i, ps1);//在每个集合元素中间插入i得到ps1
		ps = ps1;
		Perm(i + 1, n);//继续添加整数i+1
	}
}
vector<vector<int>> ps;//存放全排列
void Insert(vector<int> s, int i, vevtor<vector<int>> &ps1)
//在每个集合元素中间插入i得到ps1
{
	vector<int> s1;
	vector<int>::iterator it;
	for (int j = 0; j < i; j++)//在s(含i-1个整数)的每个位置插入i
	{
		s1 = s;
		it = s1.begin() + j;//求出插入位置
		s1.insert(it, i);//输入整数i
		ps1.push_back(s1);//添加到ps1中
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值