//深度优化搜索:判断是否可以从给定整数中选出若干数,使它们的和恰好为k
#include<iostream>
#include<cstdio>
#define MAX 5
using namespace std;
int a[MAX] ={1,2,4,7};
int n,k;
bool dfs(inti,int sum){
// 如果前面几项都计算过了,则返回sum的值是否和k相等
if (i == n)return sum == k;
// 不加上a[i]的情况
if (dfs(i + 1,sum))return true;
// 加上a[i]的情况。
if (dfs(i + 1,sum + a[i]))return true;
return false;
}
void solve(){
if (dfs(0,0))cout << "Yes"<< endl;
else cout << "No" <<endl;
}
int main(){
cin >> k >> n;
solve();
}
代码框架:
void dfs(type input,type result,int step){
if(数据非法)return 0;//数据非法
if(step==input.size()){//收敛条件
将path放入path
}
if(减枝)return;
for(...){//执行所有可能的扩展动作
执行动作,修改path
dsf(input,result,step+1);
恢复path
}
}