蛮力法所依赖的基本技术是遍历技术,采用一定的策略将待求解问题的所有元素依次处理一次,从而找到问题的解。
大问题: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中
}
}