DFS深度優先搜尋入門(1)
阿新 • • 發佈:2018-12-11
給定整數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; }