深搜--P1036选数

深搜中绝对会用到递归

因此本题也可以使用深搜来做

bool prime(int b) {
    memset(sz, true, sizeof(sz));
   sz[1]=false;
    for (int i=2;i<=b;i++) {
        if (sz[i]) {
            for (int j=2*i;j<=b;j+=i)
                sz[j]=false; 

定义一个dfs函数来解决对数的搜索

step代表执行步数

sum代表已经选好的数据的和

cet代表已经选完的数的个数

接下来进行搜索

另外介绍下非朴素版的寻找质数的方法

被人称作爱氏筛法

但是呢,我在本题中并未使用

深搜程序:

#include<cstdio>
#include<cmath>
#include<cstdio>
using namespace std;
int a[10001];
int n,k,tot,sum;
inline bool prime(int);
inline void dfs(int,int ,int);
inline void print()
    {
        printf("%d",tot);
    }
int main()
{
    scanf("%d%d",&n,&k);
    for(register int i=1;i<=n;i++)
       scanf("%d",&a[i]);
    dfs(1,0,0);
    print();
    return 0;
}
bool prime(int l)
{

    for(int i=2;i<=sqrt(l);i++)
    {
        if(l%i==0) return false;

    }
    return  true;

}
void dfs(int step,int sum,int cet)
{
    if(step==n+1||cet==k)
    {
        if(prime(sum)&&cet==k)
          tot++;
        return;
    }
    dfs(step+1,sum+a[step],cet+1);
    dfs(step+1,sum,cet);
    return;
}

爱氏筛法

原文地址:https://www.cnblogs.com/-Iris-/p/12257529.html

时间: 2024-10-08 16:42:52

深搜--P1036选数的相关文章

P1036选数

P1036选数 链接 P1036 选数 思路 DFS 代码实现 #include<bits/stdc++.h> using namespace std; const int maxn = 25; typedef long long ll; ll a[maxn]; ll n,k; ll ans; bool check(ll x){ for(int i = 2; i*i <= x; i++){ if(x%i==0) return 0; } return 1; } void dfs(int x

【深搜】【数】Codeforces 707D Persistent Bookcase

题目链接: http://codeforces.com/problemset/problem/707/D 题目大意: 一个N*M的书架,支持4种操作 1.把(x,y)变为有书. 2.把(x,y)变为没书. 3.把x行上的所有书状态改变,有变没,没变有. 4.回到第K个操作时的状态. 求每一次操作后书架上总共多少书. 题目思路: [深搜][树] 现场有一点思路不过没敢写哈.还是太弱了. 总共只用保存一张图,把操作看成一棵树,一开始I操作连接在I-1操作后,如果遇到操作4的话,把I操作与I-1操作的

洛谷P1036 选数

题目描述 已知 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). 输入输出格式 输入格式: 键盘输入,格式为: n , k (1<=n<=20,

洛谷—— P1036 选数 || Vijos——选数

https://vijos.org/p/1128|| https://www.luogu.org/problem/show?pid=1036#sub 描述 已知 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. 现在,要求你计算出和为素数共有多少种

P1036 选数

题目描述 已知 nn 个整数 x_1,x_2,…,x_nx1?,x2?,…,xn?,以及11个整数kk(k<nk<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和.例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为: 3+7+12=223+7+12=22 3+7+19=293+7+19=29 7+12+19=387+12+19=38 3+12+19=343+12+19=34. 现在,要求你计算出和为素数共有多少种.

题解 P1036 【选数】

关于 P1036 [选数] 嗯,新手试炼场的,错了两次,对,我是蒟蒻. 因为这道题对我有帮助,所以,它是好题. 错啦两次,好尬的. 49--17--100: 不费话了,过程函数与递推. 当然要递推: 49分的不说了,从未先编译一下试试. 跟着题目走,判断质数. 来一段辣鸡代码 #include<bits/stdc++.h> using namespace std; int n,k; int x[25]; int ans; bool judge_prime(int x) { for(regist

方格取数(多线程dp,深搜)

https://www.luogu.org/problem/P1004 题目描述 设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0).此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大. 输入格式 输入的第一行为一个整数N(表示N×N的方格图),接下来的每行有三个整数,前

1008 选数

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 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. 现在,要求你计算出和为素

BNU 1084 Expected Allowance (dp||母函数||深搜)

题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=1084 题目大意:给你n个骰子,每个骰子有m个面,点数分别为(1-m),现在同时摇这n个骰子,(得到的点数和)-k  即为小明得到的钱数,当然小明每次最少会得到一元(即最后结果小于等于1时),问小明得到钱数的期望值. 解题思路:由于此题m*n较小,故按照普通的期望计算就行,即   摇到某个点数(i)的概率p*摇到的点数(i),其中显然(n=<  i  <=n*m)除以总的情况数(m的n次方)(