C++部分和问题

部分和问题:
给定整数a1,a2,…,an判断是否可以从中选出若干数,使他们的和恰好为k
样例1:
输入:
n=4
a={1,2,4,7}
k=13
输出:
Yes(13 = 2 + 4 + 7)

样例2:
输入:
n=4
a={1,2,4,7}
k=15
输出:
No

思想:
这道题明显看上去就是一个递归搜索的问题。对于每一个数有两种状态:选取和不选取。如图:
C++部分和问题_第1张图片
左分支是不选取状态,右分支是选取状态。我们不断递归左分支,再不断递归右分支。

#include
using namespace std;
int a[1000];
int dfs(int,int);
int k,n;
int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cin>>k;
    dfs(0,0);
    if(dfs(0,0)){
        cout<<"yes";
    }else{
        cout<<"no";
    }
    return 0;
}
int dfs(int i,int sum){
    if(i==n)return sum==k;
    if(dfs(i+1,sum)){
      return 1;  
    }
    if(dfs(i+1,sum+a[i])){
       return 1; 
    }
    return 0;
}

你可能感兴趣的:(代码)