DFS
http://blog.csdn.net/hackbuteer1/article/details/8035261
/**
** author :hackbuteer
** date :2012-10-01
**/
#include<iostream>
#include<vector>
using namespace std;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int len = 10 , m = 3;
void dfs(int num , vector<int>& vec , int curnum , int id)
{
int i ;
if(curnum == num)
{
static int k = 1 ;
cout<<k++<<": ";
for( i = 0; i < vec.size() ; ++i)
cout<<vec[i]<<" ";
cout<<endl;
return;
}
for( i = id; i < len; ++i)
{
vec.push_back(arr[i]);
dfs(num , vec , curnum + 1 , i + 1);
vec.pop_back();
}
}
int main(void)
{
vector<int>vec;
dfs(m , vec , 0 , 0);
return 0;
}
int arr[] = {1,2,3,4,5,8,5,8,9,10};
int len = 10 , m = 3;
void dfs(int index , int num , vector<int> &vec)
{
int i ;
if(index == len+1)
return ;
if(num == 0)
{
static int k = 1 ;
cout<<k++<<": ";
for( i = 0; i < vec.size() ; ++i)
cout<<vec[i]<<" ";
cout<<endl;
return;
}
vec.push_back(arr[index]); // 选取第index个元素
dfs(index + 1 , num - 1 , vec);
vec.pop_back(); // 不选取第index个元素
dfs(index + 1 , num , vec);
}
int main(void)
{
vector<int>vec;
dfs(0 , m , vec);
return 0;
}
根据上述算法,可以很容易的扩展为,从一个数组中,找到所有相加等于m的数的组合。
也就是说
int arr[]={1,2,3,4,5,6,7,8,9};
从arr中找到所有相加等于10的数 类似这样的功能
源码如下:
void test(int num,vector<int>& vec,int curSum,int id)
{
int i;
if(num<=curSum)
{
if(num<curSum)
return;
else
{
static int k = 1 ;
cout<<k++<<": ";
for( i = 0; i < vec.size() ; ++i)
cout<<vec[i]<<" ";
cout<<endl;
return;
}
}
for(i=id;i<len;i++)
{
vec.push_back(arr[i]);
test(num,vec,curSum+arr[i],i+1);
vec.pop_back();
}
}
同样他的应用,也可以扩展到因式分解问题上来:
对于给定的正整数n,计算n有多少种不同的分解式。
例如当n==12时
12=12
12=6*2
12=4*3
12=3*2*2
源码如下:显得有点笨拙
//n为计算的最终结果,cur为当前的计算结果,如果cur==n 则输出; col为数组,id为编号 从1-n
void solve1(int n,int cur,std::stack<int> col,int id)
{
if(cur>=n)
{
if(cur>n)
return;
std::vector<int> temp;
BOOL flag=TRUE;
while(!col.empty())
{
if(col.top()==1)
{
flag=FALSE;
}
temp.push_back(col.top());
col.pop();
}
if(flag)
{
std::vector<int>::iterator iter=temp.begin();
for(;iter!=temp.end();iter++)
cout<<*iter<<" ";
cout<<endl;
}
return;
}
else
{
for(int i=id;i<=n;i++)
{
if(n%i==0&&(col.empty()||col.top()<=i))
{
cur*=i;
col.push(i);
solve1(n,cur,col,id+1);
col.pop();
cur/=i;
}
}
}
}
int main(void)
{
std::stack<int> col;
solve1(12,1,col,1);
return 0;
}