[낙곡] 프로세스 함수와 귀속 P1036 선택

제목 설명
nnn 개 정수 x1, x2,..., xnx_1,x_2,…,x_nx1, x2,..., xn, 그리고 111개의 정수 kkk(k
3+7+12=223+7+12=223+7+12=22
3+7+19=293+7+19=293+7+19=29
7+12+19=387+12+19=387+12+19=38
3+12+19=343+12+19=343+12+19=34.
지금, 너에게 소수와 모두 몇 가지가 있는지 계산해 보라고 요구한다.
예를 들어 상례에서 단 한 가지의 합은 소수: 3+7+19=293+7+19=293+7+19=29이다.형식 입력
키보드 입력, 형식:
n,kn,kn,k(1≤n≤20,k
x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n(1\le x_i\le 5000000) x1, x2,..., xn(1≤xi≤ 5000000) 출력 형식
화면 출력, 형식: 111개의 정수 (조건을 충족하는 종)
입력 출력 샘플 입력 #1 4 3 7 12 19
출력 #1
#include 
#include  
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
// :  , DFS 、
using namespace std;
const int maxn=100;
int n , k ;   // n , , 
int x[maxn]; 
int index=0,nowk=0,ans=0,sum=0;

//void Dfs(int index,int nowk,int  sum)
//{
//	if(index==n)
//	    {
//	    	if(nowk==k)
//	    	{
//	    		for(int i = 2 ; i <=sqrt(sum);i++)
//	    		{
//	    			if(sum%i == 0)
//	    			{
//	    				return ;
//					}
//				}
//				ans++;
//			}
//	    	return ;
//		}
//	
//	Dfs(index+1,nowk,sum);   // 
//	Dfs(index+1,nowk+1,sum+x[index]);  //  
//}

// ,1. nowk k return, !
// 2.  
void Dfs(int index,int nowk,int  sum)
{
	int status=0;
	if(index==n)
	{
		return ;
	 } 
	 
	 Dfs(index+1,nowk,sum);   // 
	 
	if(nowk+1<=k)
	{
		if(nowk+1==k)
		{
	    for(int i = 2 ; i <=sqrt(sum+x[index]);i++)
	    {
	    	if((sum+x[index])%i == 0)
	    	{
	    		status=1;
	    		break;
			}	
		}
		
		if(status==0)
		{
		ans++;
		 
		} 
		
	}
	status=0;
		Dfs(index+1,nowk+1,sum+x[index]);  //  
	}
	
	
}

int main(int argc, char** argv) {
	cin >> n >> k ;
	for(int i = 0 ; i < n ; i++)
	{
		cin >> x[i];
	 } 
	 //index,nowk,sum 
	Dfs(index,nowk,sum);
	cout << ans;
	return 0;
}

소수의 판단은 체법으로 복잡도를 낮출 수 있다

좋은 웹페이지 즐겨찾기