原题链接
本题思路:暴力深搜,具体见代码。
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 const int maxn = 20 + 5; 6 int a[maxn]; 7 int n, k; 8 bool flag; 9 stack <int > s; 10 11 bool dfs(int i, int sum) { 12 if(i == n) return sum == k;//当搜到最后一个数时返回sum == k 13 if(dfs(i + 1, sum)) return true;//不加这个数的情况 14 if(dfs(i + 1, sum + a[i])) {//如果添加这个数满足k == sum 则将这个数加入栈中 15 s.push(a[i]); 16 return true; 17 } 18 return false; 19 } 20 21 int main () { 22 while(cin >> n >> k) { 23 flag = true; 24 if(n == 0) break; 25 for(int i = 0; i < n; i ++) 26 cin >> a[i]; 27 flag = dfs(0, 0); 28 if(flag) { 29 cout << "YES" << endl; 30 while(!s.empty()) { 31 cout << s.top() << " "; 32 s.pop(); 33 } 34 } else cout << "NO" << endl; 35 } 36 return 0; 37 }