1. 程式人生 > >DFS深度優先搜尋入門(1)

DFS深度優先搜尋入門(1)

給定整數a1,a2,a3……an序列,從中選出若干數,使它們的和恰好為k。 限制條件:1<=n<=20 -1e8<=ai<=1e8 -1e8<=k<=1e8 輸入: n=4; a={1,2,4,7} k=13 輸出: YES (13=2+4+7)

#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
const int maxn=1e8+5;
int a[maxn];
int n,k;
bool dfs(int i,int sum)//已經從前n項得到了和sum,然後對於i項之後的進行分支
{
    if(i==n) return sum==k;//如果前i項已算過了,返回sum是否與k相等
    if(dfs(i+1,sum)) return true;//不加上a[i]的情況
    if(dfs(i+1,sum+a[i])) return true;//加上a[i]的情況
    return false;//無論是否加上a[i]都不能湊成k就返回false
}
void solve()
{
    if(dfs(0,0)) printf("YES\n");
    else printf("NO\n");
}
int main()
{

    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    cin>>k;
    solve();

    return 0;
}