[낙곡] 프로세스 함수와 귀속 P1036 선택
9740 단어 로곡 알고리즘 학습
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;
}
소수의 판단은 체법으로 복잡도를 낮출 수 있다