编程训练[C语言]——从部分和问题(DFS)重视递归边界的正确设置

部分和问题是经典的DFS问题,题目描述见样例输入输出。

【样例输入输出】
多组输入输出

Input
4
1 2 3 4
9
4
1 2 3 4
8
4
1 2 3 4
11
Output

Yes
Yes
No

输入

4
1 2 3 4
9

后输出Yes代表,能从1,2,3,4这4个数中找到一个组合,这个组合之和为9.

【代码】
(思路和出错部分见注释)

#include

#define MAXLENGTH 105

//  从a[i],a[i+1],……,a[n-1]中能否找到一个组合之和加上sum为k,返回1和0分别代表能或者不能
int dfs(int *a,int i,int sum,int n,int k){
    //  正确设置递归边界
    if(i==n){     //致命错误:误写成i==n-1
        if(sum==k){
            return 1;
        }
        else{
            return 0;
        }
    }
    else{
        if(dfs(a,i+1,sum,n,k)==1){    //不加a[i]试一试
            return 1;
        }
        if(dfs(a,i+1,sum+a[i],n,k)==1){   //加上a[i]试一试
            return 1;
        }
        //如果至此函数还没有返回,说明没有解决方案,则返回0
        return 0;
    }
}

int main(){
    int a[MAXLENGTH];
    int n,k;
    while(scanf("%d",&n)==1){
        for(int i=0;i<n;i++){
            scanf("%d",a+i);
        }
        scanf("%d",&k);
        (dfs(a,0,0,n,k)==1)?printf("Yes\n"):printf("No\n");
    }
    return 0;
}

你可能感兴趣的:(刷点算法题)