目录
1.排列问题
设R={r1,r2,r3..., rn }是要进行排列的n个元素,Ri = R- {ri}。
集合X中元素的全排列记为perm(X)。(ri)perm(x)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。
R的全排列可归纳定义如下∶
- 当n=1时,perm (R) = (r),其中r是集合R中唯一的元素;
- 当n1时,perm (R)由(ri) perm(R1)(r2) perm(R2),...(ri) perm(Ri)构成。
图示:
R的全排列可归纳定义如下:
- 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
- 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),......(ri)perm(Ri)构成。
图示:
全排列代码:
void Perm(int* nums, int k, int m)
{
if (k == m)
{
for (int i = 0; i <= m; i++)
{
cout << nums[i] << " ";
}
cout << endl;
}
else
{
for (int j = k; j <= m; j++)
{
swap(nums[j], nums[k]);
Perm(nums, k + 1, m);
swap(nums[j], nums[k]);
}
}
}
int main()
{
int arr[] = { 1,2,3 };
int n = sizeof(arr) / sizeof(arr[0]);
Perm(arr, 0, n - 1);
return 0;
}
图示:
2.子集树
代码:
void funa(int *ar,int*br,int i,int n)
{
if (i == n)
{
for (int j = 0; j < n; j++)
{
if (br[j] == 1)
{
cout << ar[j] << " ";
}
}
cout << endl;
}
else
{
br[i] = 1;
funa(ar, br, i + 1, n); //left
br[i] = 0;
funa(ar,br,i + 1, n); //right
}
}
int main()
{
int ar[] = { 1,2,3 };
int br[] = { 0,0,0 };
funa(ar,br,0, 3);
return 0;
}
图示: