2.1.4.1部分和问题

问题描述:

给定整数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();
}



猜你喜欢

转载自blog.csdn.net/qq_38943651/article/details/79066772