洛谷 - P1036 选数(递归)

题目链接:点击查看

题目大意:给出n个数,我们需要从中选k个作为一个新的集合,问新集合的权值和有多少是素数

题目分析:这个题目考考察了两点:

  1. 判断素数
  2. 设计递归

为什么把判断素数单独列出来了呢?因为一开始我的试除法写错了。。然后调了好久,递归的设计还算可以,不算难也不算太简单(对我来说),用递归跑一下所有子集就好了,具体怎么枚举所有子集且保证不重不漏,我们可以设计一个不降原则的递归,这样每次枚举新的起点,就能做到在选出k个数的情况下,令起点递增,从而做到不会让子集重复,具体的看代码吧

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
  
typedef long long LL;
  
const int inf=0x3f3f3f3f;
  
const int N=25;

int n,k;

int a[N];

int is_pri(int x)//试除法
{
	if(x<2)
		return 0;
	for(int i=2;i*i<=x;i++)
		if(x%i==0)
			return 0;
	return 1;
}

int dfs(int left,int sum,int start)//left:还需要选几个数 sum:当前子序列之和 start:当前起点
{
	if(left==0)
		return is_pri(sum);
	int ans=0;
	for(int i=start;i<=n;i++)//从起点枚举到终点
		ans+=dfs(left-1,sum+a[i],i+1);//若选择当前的数后的答案
	return ans;
}

int main()
{
//	freopen("input.txt","r",stdin);
//	ios::sync_with_stdio(false);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i);
	printf("%d\n",dfs(k,0,1));	 
	 
	
	
	
     
     
     
      
      
      
      
       
      
    return 0;
}

 

你可能感兴趣的:(暴力)