//-------------部分和问题----------- //给定整数a1,a2, ,,,an,判断是否可以从中选出若干数, 使他们的和恰好为k // 其中n范围为【1,20】 //算法分析:从a1开始按顺序决定每个数加或不加,在全部n个数都决定后再判断他们的和是不是k即可、 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; int n, k; int a[22]; bool dfs(int i, int sum) { if (i == n) return sum == k; //如果前n项都计算过了,则返回sun是否与k相等 if (dfs(i+1, sum)) //不加上a【i】的情况 return true; if (dfs(i+1, sum+a[i])) //加上a【i】的情况 return true; return false; //无论是否加上a【i】都不能凑成sum则返回false } int main() { memset(a, 0, sizeof(a)); cin >>n >> k; for (int i=0; i<n; i++) cin >> a[i]; if (dfs(0, 0)) cout << "YES"<< endl; else cout << "NO"<< endl; return 0; }