羅区P1036- *素数の数を決定するためのオプション[+]再帰

質問の意味:

既知のn個の整数のX1、X2、...、XN、および整数k(K <N)。必要に応じてそれぞれ使用可能の範囲でnは整数の整数kを加えます。次のようにそれらのすべての組み合わせで使用可能3,7,12,19、及びである場合、例えば、n = 4の場合、K = 3,4は整数
3 + 12 = 22 + 7
3 + 7 + 19 = 29
7 19 = 38 + 12 +
3 + 12 + 19 = 34は、
今種の合計数を計算するように依頼し、素数です。
= 293 = 29 + 7 3 + 19 + 7 + 19:たとえば、実施形態は、一つだけ、そして素数です。

入力形式
キーボード入力形式:
N-、K、X1 ... Xnの(1 <= N - <= 20 <= N - 、XI <= 5000000、Kです。)

出力フォーマット
画面出力形式は次のとおりです。整数(いくつかの基準を満たします)。

サンプル入力出力
入力#1の複製
。4. 3
。3 12です。7. 19
出力#1のコピー
1

ソリューション:

ボードへの素数の使用を決定し、重要な問題は、すべてのn個の番号kに対して選択された例数を列挙する方法です。中のマーカーのVIS []アレイの数の必要ながら、選択された再帰関数の数を定義することができる、独立変数の数は、現在選択されているの数、選択し、次の先頭の番号を選択の総数でありますこれは、以前に選択されていました。
以下に擬似コードです。

void Digui(int cnt,int sum,int fir)
{
	如果cnt==n(表示数已选完)
		则:判断总和是否为质数,如果是则给答案加一
	否则(继续选择下一个数)
		从fir到n-1逐个枚举,用vis[]标记已经选过的数
		Digui(cnt+1,sum+a[i],i+1)
		取消vis[]的标记,枚举下一个数
}

コード:

#include<stdio.h>
int sum,n,k,a[25],vis[25],ans=0;
int judge(int c)
{
	for(int i=2;i*i<=c;i++)if(c%i==0)return 0;
	return 1;
}
void dfs(int cnt,int sum,int fir)
{
	if(cnt==k)
	{
		ans+=judge(sum);
		return;
	}
	for(int i=fir;i<n;i++)
	{
		if(vis[i]==1)continue;
		vis[i]=1;
		dfs(cnt+1,sum+a[i],i+1);
		vis[i]=0;
	}
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		vis[i]=0;
	}
	dfs(0,0,0);
	printf("%d\n",ans);
}
リリース8元の記事 ウォンの賞賛1 ビュー325

おすすめ

転載: blog.csdn.net/weixin_42921101/article/details/104310172