루오 구 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
이제 종의 총 수를 계산하도록 요청하고 소수입니다.
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);
}
출시 팔 개 원래 기사 · 원 찬양 한 · 전망 (325)

추천

출처blog.csdn.net/weixin_42921101/article/details/104310172