深度优先搜索

本题是组合问题,求不同的数的组和是否为素数

代码实现


    #include <stdio.h>
    #include <stdbool.h>
    
    int n, k;
    int a[20];
    int count = 0;//定义全局变量,否则无法在函数中使用。
    
    bool isPrime(int num) {//经典的判断素数的函数,需要注意的是,2是素数,但是1不是素数,所以需要特判。
        if(num < 2) return false;
        for(int i = 2; i * i <= num; i++) {
            if(num % i == 0) return false;
        }
        return true;
    }
    
    void dfs(int start, int sum, int selceted) {//dfs主要过程是,从start开始,选selceted个数字,和为sum。
        if(selceted == k) {
            if(isPrime(sum)) {
                count++;//用两个if来判断条件,不能合并,因为selected==k需要结束,而此时sum不一定是素数,所以需要判断。
            }
            return;
        }
        for(int i = start; i < n; i++) {
            dfs(i + 1, sum + a[i], selceted + 1);//这里是i+1,不是start+1,因为start是当前的起点,i是当前的位置,i+1是下一个位置。
                                                 //如果dfs返回了,会进入下一个循环,所以i可能从1变为3。
        }
    }
    
    int main() {
        scanf("%d %d", &n, &k);
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        dfs(0, 0, 0);
        printf("%d", count);
        return 0;
}