這道題的關鍵在於如何列出所有的選數組合,那麼自然想到遞迴。我們將n個數存入陣列num中,選數過程可以看作是從下標0~n-1中選擇不重複的k個填滿k個空位。函式dfs()中sum記錄當前已選數的累加和,left記錄當前剩餘空位數,p指出當前空位可以從num中哪一位下標開始選。由於組合是無序的,且不能選擇重複的數,所以要遵循從前往後選數的規則,即後乙個空位只能選擇num中下標比前乙個空位所選數下標大的數。另一方面,還必須保證後面所有的空位都至少有乙個選擇,所以當前空位所選數的下標最大只能是n-left。因此p~n-left都是當前可能的選擇,遍歷所有可能遞迴呼叫dfs()進行下乙個空位的選擇即可。直到left為0,說明已無空位,判定當前的sum是否為素數然後退出。
這道題的關鍵在於如何列出所有的選數組合,那麼自然想到遞迴。我們將n個數存入陣列num中,選數過程可以看作是從下標0~n-1中選擇不重複的k個填滿k個空位。函式dfs()中sum記錄當前已選數的累加和,left記錄當前剩餘空位數,p指出當前空位可以從num中哪一位下標開始選。由於組合是無序的,且不能選擇重複的數,所以要遵循從前往後選數的規則,即後乙個空位只能選擇num中下標比前乙個空位所選數下標大的數。另一方面,還必須保證後面所有的空位都至少有乙個選擇,所以當前空位所選數的下標最大只能是n-left。因此p~n-left都是當前可能的選擇,遍歷所有可能遞迴呼叫dfs()進行下乙個空位的選擇即可。直到left為0,說明已無空位,判定當前的sum是否為素數然後退出。
#include int n, k, cnt;
int num[25];
int isprime(int n)
void dfs(int sum, int p, int left)
for (int i = p; i <= n - left; i++)
dfs(sum + num[i], i + 1, left - 1);
}int main()
洛谷P1036 選數
已知 n 個整數 x1,x2,xn,以及乙個整數 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。...
洛谷 P1036選數
已知 n 個整數 x1,x2,xn以及1個整數k k3 7 12 22 3 7 19 29 7 12 19 38 3 12 19 34 現在,要求你計算出和為素數共有多少種。例如上例,只有一種的和為素數 3 7 19 29。輸入格式 鍵盤輸入,格式為 n,k 1 n 20,kx1,x2,xn 1 x...
洛谷P1036選數
題目描述 已知 n 個整數 x1,x2,xn,以及1個整數k k3 7 12 22 3 7 19 29 7 12 19 38 3 12 19 34 現在,要求你計算出和為素數共有多少種。例如上例,只有一種的和為素數 3 7 19 29 輸入樣例 4 33 7 12 19 輸出樣例 1 include...