深搜c++

本文介绍了如何用C++编写一个递归函数dfs来解决NOIP2002普及组竞赛中的一道题目,计算在给定整数数组中,最少需要多少个连续元素之和使其成为质数。函数通过逐个尝试添加数组元素并减少剩余元素计数来实现。
摘要由CSDN通过智能技术生成

NOIP 2002 普及组第二题

#include<bits/stdc++.h>
using namespace std;
int n,k,x[22];
int isPrime(int s){//检查是否质数,是为1,不是为0 
	for(int i=2;i*i<=s;i++){
		if(s%i==0)
			return 0;
	}
	return 1; 
}


/*
tmpSum 目前的x个数的和(x<=k)
start 开始循环的下标 
end 结束循环的下标 
*/
int dfs(int k,int tmpSum,int start,int end){
	if(k==0)
		return isPrime(tmpSum);
	int sum=0;//初始化质数个数为0 
	for(int i=start;i<=end;i++){
		sum+=dfs(k-1,tmpSum+x[i],i+1,end);//每进行一次dfs就把k-1,表示每次tmpSum加完一个x[i]就可以少加一个; 每次循环开始位置从当前位置往后后移一位 
	}
	return sum;
} 
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>x[i];
	}
	cout<<dfs(k,0,0,n-1);//一开始所需要加的数组元素个数为k,此时已经相加了的元素值为0,初始开始循环的坐标为1 
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值