질문의 의미 :
알려진 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
이제 종의 총 수를 계산하도록 요청하고 소수입니다.
3 + 7 + 7 + 19 + 19 = 293 = 29 : 예를 들어, 실시 예에서, 오직 하나, 및는 소수이다.
입력 형식
키보드 입력 형식 :
N-, K, X1 ... XN (. 1 <= N - <= 20, K는 <= N-, XI <= 5000000)
출력 포맷
화면 출력 형식은 : 정수 (몇몇 기준을 만족).
샘플 입력 출력
입력 # 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);
}