下面列出一个很简单的DFS,如下:
部分和问题(Depth-First-Search):
给定整数a1,a2,.......an,判断是否存在某种组合,使它们的和恰好为K.。
!限制条件
1<=n<=20
-100000000<=ai<=100000000
-100000000<=K<=100000000
输入实例:n=4
a={1,2,4,7}
k=13
输出:YES!
处理这个问题的方法很简单,并且实现方式也可不同,最直接的方式是:在全部N个数都决定后再判断它们的和是不是K即可。判断每一种组合方式(与顺序无关)是否满足和为K的情况,如果是则输出YES!否则输出NO!
下面列出代码简单实现过程:
#include<iostream>
using namesapce std;
const int MAX_N=50; //全局变量,最大处理数据
int a[MAX_N]; //记录输入的a1~an
int n,k;
bool dfs(int i,int sum){ //从第一个下标为0的元素开始
if(i==n) return sum==k; //递归出口
if(dfs(i+1,sum)) //不加a[i]的情况
return true;
if(dfs(i+1,sum+a[i])) //加a[i]
return true;
return false; //当所有情况都遍历后,,则返回假值false
}
void solve(){ //caculate
if(dfs(0,0)) cout<<"YES!" <<endl;
else
cout<<"NO!";
}
int main(){
cin>>n;
cin>>k;
getchar();
for(int i=0;i<n;i++)
cin>>a[i];
solve();
}
用递归的方式将每种加和结果的可能性事件列举判断是否满足和为k,可知组合的状态数为Cn0+Cn1+Cn2+Cn3+…Cnn=2n-1(N∈[1,20]),时间复杂度为0(2n)。该题也可利用如sum=a1+a2+a3+..+an,判断是否存在数x=an=sum-(a1+a2+...an-1)即可。