选数-DFS

题目链接  洛谷OJ1036选数

Description

已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。

Input

键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)

Output

屏幕输出,格式为:
一个整数(满足条件的种数)。

Sample Input

4 3
3 7 12 19

Sample Output

1

方法-----dfs深搜    难度-----入门

首先看题,n才20,只有一组数据,所以很轻易想到暴力。

那么我们怎样暴力呢?   只有20个数,选择出k个。那我们暴力找出所有的选择情况就好了。

比如  现在有10个数  在数组的位置从1 到 10    1 2 3 4 5 6 7 8 9 10

k=3   我们要选择3个数  就相当于有三个坑  __   __   __   找三个数填上

第一个位置 填1号  第二个位置填2号  那么第三个位置 可以填 3号 4号 5号 6 7 8 9 10号

这些情况完了  第二个位置位置可以填成 3号  那么第三个位置的选择就是 4 5 6 7 8 9 10号

以此类推  dfs暴力搜索出所有k个数组合的情况   检查和sum是不是素数 

这里检查素数用了埃氏筛法  因为数据少 不费多少时间   你也可以用提前用素数筛  筛个素数表

代码及注释

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=50;
int a[maxn];
int n,k,ans;
bool prime(int x){
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0)return false;
	}
	return true;
}
//t 代表已经选择的数字的个数  sum代表已经选择的数字之和 
//d是已经选择的数字中 最后一个数在数组中的位置
void dfs(int t,int sum,int d){
    if(t==k){
        if(prime(sum))ans++;//达到k个 检验是否是素数 计数
    }
    else{
        for(int i=d;i

 

你可能感兴趣的:(DFS和BFS)