<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 27.2000007629395px; background-color: rgb(254, 254, 254);">题目: 有n种不同大小的数字a, 每种各m个. 判断是否可以从这些数字之中选出若干使它们的和恰好为K </span>
#include <iostream>
using namespace std;
int A[3]= {3,5,8};
int B[3]= {3,2,2};
int n=3;
int K=17;
bool dfs(int i,int j)
{
if(j==0)
{
return true;
}
bool xuefei=false;
if(i<n)
{
for(int k=0; k<=B[i]; k++)
{
if(j-k*A[i]>=0)
{
xuefei=dfs(i+1,j-k*A[i]);
if(xuefei)
break;
}
}
}
return xuefei;
}
int main()
{
cout<<dfs(0,K)<<endl;
return 0;
}
对于这种深度搜索,我们看到,并没有向上一篇那样用静态变量的方式来判断是否有等于K,而是咋递归内部搞定,方法是:
1.在递归外部,判断是否符合条件
2.定义一个bool变量,设置为false
3.在允许递归的空间内,判断是否有为真的情况,有就停止
为什么这样就可以呢。我们可以打印出来:
可以看到,只要出现了true,循环停止,返回true,