DFS練習【遞歸入門】組合+判斷素數

題目描述

已知 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 3
3 7 12 19

樣例輸出

1

【代碼】:

import java.util.Scanner;

public class Main {
	static int n, k, ans, sum = 0;
	static int x[], p[];
	static boolean vis[];

	static void dfs(int index) {
		if (index == k + 1) {
			if (isPrime(sum)) {//看加起來是否爲素數
				ans++;
				return;
			}
		}
		for (int i = 1; i <= n; i++) {
			if (vis[i] == false && i > p[index - 1]) {
				p[index] = i;
				vis[i] = true;
				sum += x[i];

				dfs(index + 1);

				vis[i] = false;
				sum -= x[i];
			}
		}

	}
    /**判斷是否爲素數*/
	static boolean isPrime(int t) {
		if (t <= 1)
			return false;
		for (int i = 2; i * i <= t; i++)
			if (t % i == 0)
				return false;
		return true;
	}

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		k = sc.nextInt();
		x = new int[n + 1];
		p = new int[n + 1];
		vis = new boolean[n + 1];
		for (int i = 1; i <= n; i++) {
			x[i] = sc.nextInt();
			p[i] = i;
		}
		ans = 0;
		dfs(1);
		System.out.println(ans);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章