问题描述:
给定整数a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k。
限制条件:
1 <= n <= 20
-10^8 <= ai <= 10^8
-10^8 <= k <= 10^8
样例1:
输入
n = 4
a = {1,2,4,7}
k = 13
输出
Yes(13 = 2 + 4 7)
样例2:
输入
n = 4
a = {1,2,4,7}
k = 15
输出
No
思想:
借用完全二叉树,遍历所有情况,递归深度搜索实现。
实例代码:
#include<stdio.h>
const int MAX_N = 20;
int n,k;
int a[MAX_N];
bool dfs(int i,int sum){
if(i == n){
return sum == k;
}
if(dfs(i+1,sum)){
return true;
}
if(dfs(i+1,sum+a[i])){
return true;
}
return false;
}
void solve(){
if(dfs(0,0)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
int main(){
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&k);
solve();
}