部分和问题
时间限制:1000 ms | 内存限制:65535 KB 难度:2-
描述
-
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
-
输入
-
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
- 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入
-
12
4
13
1
2
4
7
样例输出
-
12
YES
2
4
7
-
solution:
-
因为n只有20,所以直接采用爆搜的方法,复杂度为O(2^n),考虑a[i]是否加到sum里,对于这样每个i都是可选可不选,因为要记录路径,用辅助数组直接记录加起来为k的那些数即可。
-
#include<cstdio> #include<cstring> using namespace std; int n,k,a[50],b[50]; int dfs(int x, int sum) { if (x == n)return sum == k; if (dfs(x + 1, sum))return 1; if (dfs(x + 1, sum + a[x])){ b[x] = 1; return 1; } return 0; } int main() { while (~scanf("%d%d", &n, &k)) { memset(b, 0, sizeof(b)); for (int i = 0; i < n; i++) scanf("%d", &a[i]); if (dfs(0, 0)) { printf("YES\n"); for (int i = 0; i < n; i++) if (b[i])printf("%d ", a[i]); printf("\n"); } else printf("NO\n"); } }
-
首先,n和k,n表示数的个数,k表示数的和。