如何判断从N个数中选取K个数,其和是否能够组成一个数sum,并判断组成方式有几种?
大概有两种思路:
1.1就是说对于一个确定的数我们有两种态度,选或者不选。
**1.2图解,搜素的过程。
1.3然后我们可以写出对应的搜索函数
void DFS(int i, int cnt , int s )//i标记当前搜到第几个数了,cnt记录已经选择的
//个数,S表示当前和。
{
if(i == n){
if(cnt==K )//判断出口
if(s==sum)
ans++;
return ;
}
DFS(i+1,cnt+1, sum+a[i]);//选择第i个数
DFS(i+1,cnt, sum);//不选第i个数
}
2.1我们可以开一个和数据数组大小一样的bool数组来标记一个数是否被选了;
2.2代码:
`//i标记当前搜到第几个数了,cnt记录已经选择的
void DFS( int cnt , int s ) //个数,S表示当前和。
{
if(cnt==K )//判断出口
if(s==sum)
{
ans++;
//print();
}
return ;
for(int i=1; i<=N; i++)
{
if(vis[i]==false)
{
vis[i]=true;//标记
DFS(cnt+1, sum+a[i]);//选择第i个数
vis[i]=false;取消标记,即回溯
}
}
}`
2.3我们可以利用第二种方式打印所有方案的具体情况。
*** 将数据声明为全局变量
void print()
{
for(int i=1; i<=N; i++)
{
if(vis[i])//被标记的数,是被选上的数;
{
cout<<a[i]<<" ";
}
}
cout<<endl;
return ;
}
作者:熄朝歌
2019/8/20