DFS 部分和问题
描述-
输入
-
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
- 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入
-
4 13 1 2 4 7
样例输出
-
YES 2 4 7
题解:简单DFS,利用了类似01背包,每次选择是否加a[i],同时记录路径,可以用栈记录,也可以用数组记录。神坑,需要EOF,wa了5次。
#include<cstdio> #include<algorithm> #include<stack> using namespace std; int n, k, cnt; int a[25], ans[25]; //stack<int> s; bool dfs(int i, int sum){ if (i==n) return sum==k; if (dfs(i+1,sum+a[i])){ ans[cnt++]= a[i];//数组记录 //s.push(a[i]);栈记录 return true; } if (dfs(i+1,sum)) return true; return false; } int main(){ int i; while (scanf ("%d %d", &n, &k)!=EOF){ for (i=0; i<n; i++){ scanf ("%d", &a[i]); } cnt=0; if (dfs(0,0)){ printf ("YES\n"); for (i=cnt-1;i>=0; i--){ printf ("%d ",ans[i]); } // while (!s.empty()){ // printf ("%d ",s.top()); // s.pop(); // } printf ("\n"); } else printf ("NO\n"); } return 0; }