夕拾演算法高階篇 8 組合 判斷素數 dfs

2021-07-26 10:57:06 字數 1130 閱讀 8147

題目描述

已知 n 個整數b1,b2,…,bn以及乙個整數 k(k<n)。從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。

例如當 n=4,k=3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為:

3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

現在,要求你計算出和為素數共有多少種。例如上例,只有一種的和為素數:3+7+19=29。

輸入

第一行兩個整數:n , k (1<=n<=20,k<n) 

第二行n個整數:x1,x2,…,xn (1<=xi<=5000000) 

輸出

乙個整數(滿足條件的方案數)。 

樣例輸入

4 33 7 12 19

樣例輸出

這個題上上乙個題7)組合的輸出(dfs)是一樣的。n個元素裡面選m個元素的基本思路是防止重複選。比如上面的3 7 12 選出來後,7 3 12就不能在選了。這個也非常好實現,只要存放元素的陣列是有序的,就可以保證該序列包含的元素只出現一次。

可以直接使用之前的**進行實現(如果要輸出上面題目給出的完整格式,並公升序,可以在main函式中直接對元素排序後得到),**如下

#include #include #include using namespace std;

int a[25]; //儲存輸入值的下標

int v[25]; //儲存輸入的值

int k,n,c=0;

bool isprime(int num)

} return true;

}// cur為當前的層次

void dfs(int cur)

if(isprime(sum)) c++; //符合條件

continue; //剪枝

} dfs(cur+1);

} }}int main()

dfs(1); //從第一層開始

printf("%d\n",c);

return 0;

}

1033 遞迴3(組合 判斷素數)

時間限制 1 sec 記憶體限制 128 mb 提交 1015 解決 584 提交 狀態 討論版 題目描述 題意 已知 n 個整數 x1,x2,xn,以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3,4 個整數分別為 3,7,12,19 時...

DFS 3 組合 判斷素數

problem 已知 n 個整數b1,b2,bn 以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為 3 7 12 22 3 7 19 29 7 12 19 38 3 12...

lintcode 1666 組合 判斷素數

給定 n 個整數和乙個整數 k,你可以從中選擇 k 個整數,現在,要求你計算出k個數和為素數共有多少種方案。樣例 樣例 1 輸入 a 3 7,12 19 k 3輸出 1 解釋 there are 4 ways3 7 12 223 7 19 297 12 19 383 12 19 34 and onl...