一、题目描述
通过使用分治策略,打印一个数组元素的所有子集
输入:1 2 3
输出:
1 2 3
1 2
1 3
1
2 3
2
3
二、解题思路
通过这个程序的思路进行分析
void fun(int i, int n)
{
if(i >= n) return;
else
{
fun(i + 1, n);
fun(i + 1, n);
}
}
int main()
{
fun(0, 3);
}
上述程序的递归活动如下
我们在递推的过程中将brr[i] = 1; 回归的过程中将brr[i] = 0; 最终通过brr[i] == 1 ? 打印 : 不打印;
三、代码实现
//打印子集
#if 1
void PrintSon(int* arr, int* brr,int left, int right)
{
if (left >= right)
{
for (int i = 0; i < right; ++i)
{
if (brr[i] == 1)
{
cout << arr[i] << " ";
}
}
cout << endl;
}
else
{
brr[left] = 1;
PrintSon(arr, brr, left + 1, right);
brr[left] = 0;
PrintSon(arr, brr, left + 1, right);
}
}
int main()
{
int arr[] = {1, 2, 3};
int brr[] = {0, 0, 0};
PrintSon(arr, brr, 0, 3);
return 0;
}