部分和问题(DFS,回溯)

描述:给定整数a1,a2,….an.判断是否可以从中选出若干数,使他们的和恰好为k。
题意分析:
DFS的基本思路,从某个状态开始,不断的转移状态直到无法转移退回前一步的状态,继续转移其他的状态,如此重复,直到找到最终的解。

#include
using namespace std;
int a[10010],n,k;
bool dfs(int i,int sum){
     //如果前n项计算过了,返回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 ;
    //无论是否加上a[i]都不能凑成k,返回false
    return false ;
}
int main(){
    cin>>n>>k; //输入n个整数,总和为k
    int i;
    for(i=0;icin>>a[i];
    if(dfs(0,0)) cout<<"YES"<else cout<<"NO"<return 0;
}

你可能感兴趣的:(部分和问题(DFS,回溯))