求各位大佬帮忙看一下哪里错了
查看原帖
求各位大佬帮忙看一下哪里错了
489957
JosephWang楼主2021/4/16 19:23
基本的思路就是DFS
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 30;

int n, k, ans = 0, sum = 0;
int a[N], path[N];
bool st[N];

bool isPrime(int num)
{
	if(num < 2) return false;
	for(int i = 2; i<=num/ i; i++)
	{
		if(num % i == 0)
		{
			return false; 
		}
	}
	
	return true;
 } 


void dfs(int u)  //u代表枚举到了第几个数
{
	if(u >= k + 1)
	{
		//for(int i = 1; i<=k; i++) printf("%d ", path[i]);
		//puts("");
		
		for(int i = 1; i<=k; i++) sum += path[i];
		
		if(isPrime(sum)) ans++;
		//ans++;
		return;
	}
	
	for(int i = 1; i<=n; i++)
	{
		if(!st[i] && path[u - 1] <= a[i])
		{
			sum += a[i];
			st[i] = true;
			path[u] = a[i];
			dfs(u + 1);
			
			//恢复现场
			st[i] = false; 
		}
	}
}


int main()
{
	cin>>n>>k;
	for(int i = 1; i<=n; i++)
	{
		cin>>a[i];
	}
	
	dfs(1);
	
	cout<<ans<<endl;
	
	return 0;
}
2021/4/16 19:23
加载中...