(一)元素无重,不可复选
排列
int path[20]={0};
int count=0;
int used[20]={0};
void backtrack(int nums[],int len,int depth)
{
if(depth==len)
{
for(int i=0;i<count;i++)
printf("%d",path[i]);
}
for(int i=0;i<len;i++)
{
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,depth+1);
count--;
used[i]=0;
}
}
}
子集
void backtrack(int nums[],int len,int start)
{
printf("\n");
for (int i=0;i<count;i++)
{
printf("%d",path[i]);
}
for(int i=start;i<len;i++)
{
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,i);
count--;
used[i]=0;
}
}
}
组合
void backtrack(int nums[],int len,int start,int depth,int k)
{
if(depth==k)
{
for(int i=0;i<count;i++)
{
printf("%d",path[i]);
}
}
for(int i=start;i<len;i++)
{
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,i,depth+1,k);
count--;
used[i]=0;
}
}
}
组合总和
int path[20]={0};
int count=0;
int used[20]={0};
void backtrack(int nums[],int len,int start,int target)
{
if(target<0)
return;
if(target==0)
{
for (int i=0;i<count;i++)
printf("%d",path[i]);
}
for(int i=start;i<len;i++)
{
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,i,target-nums[i]);
count--;
used[i]=0;
}
}
}
(二)元素可重,不可复选(相同的数在某个组合中只能被选一次)
子集
void backtrack(int nums[],int len,int start)
{
printf("\n");
for(int i=0;i<count;i++)
{
printf("%d",path[i]);
}
for(int i=start;i<len;i++)
{
if(i>start&&nums[i]==nums[i-1])//重复元素直接跳过
continue;
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,i);
count--;
used[i]=0;
}
}
}
组合
void backtrack(int nums[],int len,int start,int depth,int k)
{
if(depth==k)
{
printf("\n");
for(int i=0;i<count;i++)
{
printf("%d",path[i]);
}
}
for(int i=start;i<len;i++)
{
if(i>start&&nums[i]==nums[i-1])
continue;
if(used[i]==0)
{
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,i,depth+1,k);
count--;
used[i]=0;
}
}
}
排列
void backtrack(int nums[],int len,int depth)
{
if(depth==len)
{
printf("\n");
for(int i=0;i<len;i++)
printf("%d",path[i]);
}
for(int i=0;i<len;i++)
{
if(used[i]==0)
{
if(nums[i]==nums[i-1]&&used[i-1]==0)
continue;
path[count++]=nums[i];
used[i]=1;
backtrack(nums,len,depth+1);
count--;
used[i]=0;
}
}
}
三 元素无重,可以复选(nums[]中没有重复元素,但每个元素可以被无限次选取)
总结
1.元素无重,不可复选(nums中无重复元素,且每个元素只能使用一次