给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
#include<stdio.h>
int num[10]={0};
int x[10];
int n;
void f(int index)
{
//边界
if(index==n+1)
{
printf("{");
for(int i=1;i<=n;++i)
{
if(num[i]==1)
{
printf("%d ",x[i]);
}
}
printf("}\n");
return;
}
num[index]=0;
f(index+1);
num[index]=1;
f(index+1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&x[i]);
f(1);
return 0;
}
DFS
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> temp;
int n;
int x[10];
void dfs(int index)
{
if(index==n)
{
for(int i=0;i<temp.size();++i)
{
printf("%d",temp[i]);
}
printf("\n");
return;
}
//dfs
temp.push_back(x[index]);
dfs(index+1);
temp.pop_back();
dfs(index+1);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&x[i]);
dfs(0);
return 0;
}
包含k个数的所有集合
case 1:
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> temp;
int n,k;
int x[10];
void dfs(int index)
{
if(index==n)
{
int len=temp.size();
if(len==k)
{
for(int i=0;i<temp.size();++i)
{
printf("%d",temp[i]);
}
printf("\n");
return;
}
return;
}
//dfs
temp.push_back(x[index]);
dfs(index+1);
temp.pop_back();
dfs(index+1);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;++i)
scanf("%d",&x[i]);
dfs(0);
return 0;
}
case 2:
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> temp;
int n,k;
int x[10];
void dfs(int index,int num)
{
if(index==n)
{
if(num==k)
{
for(int i=0;i<temp.size();++i)
printf("%d",temp[i]);
printf("\n");
}
return;
}
//dfs
temp.push_back(x[index]);
dfs(index+1,num++);
temp.pop_back();
dfs(index+1,num);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;++i)
scanf("%d",&x[i]);
dfs(0,0);
return 0;
}