求{1,2,3}的子集————回溯法(遞迴與非遞迴)
阿新 • • 發佈:2019-01-24
求ar[]={1,2,3}的子集序列,小夥伴們可以先自己嘗試解一下~~
#include<iostream>
using namespace std;
//用回溯法搜尋子集樹
void fun(int *ar,int *br,int n)//非遞迴
{
int k = 0;
br[k] = -1;
while(k >= 0)
{
br[k]+=1;
if(br[k] <= 1)
{
if(k == n)
{
for(int i = 0;i<n;++i)
{
if(br[i])
{
cout<<ar[i]<<" ";
}
}
cout<<endl;
--k;
}
else
{
k++;
br[k] = -1 ;
}
}
else
{
--k;
}
}
}
void fun(int *ar,int *br,int i,int n)//遞迴
{
if(i == n)
{
for(int j = 0;j<n;++j)
{
if(br[j])
{
cout<<ar[j]<<" ";
}
}
cout <<endl;
}
else
{
br[i] = 1;
fun(ar,br,i+1,n);// left;
br[i] = 0;
fun(ar,br,i+1,n);// right;
}
}
void main()
{
int ar[]={1,2,3};
int br[]={0,0,0};
int n = sizeof(ar)/sizeof(ar[0]);
fun(ar,br,0,n);
}
//最後一行的輸出結果為空子集
//(1,1,1)–》(1,2,3)
//(1,1,0)–》(1,2)
//(1,0,1)–》(1,3)
……以此類推,寫出幾個方便大家理解##