質問の意味:
既知の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);
}