作为一个 DFS 初学者这题真的做得很惨。。。其实窝学 DFS 一年多了,然后一开始就学不会最近被图论和数据结构打自闭后才准备好好学一学233


一开始,直接套框架,于是就有

#include <iostream>
#include <stdio.h> using namespace std; int n,k,a[21],ans,sum,book[50000010]; int pd(int x)
{
for(int i=2;i<x;i++)
if(!(x%i))
return 0;
return 1;
} void dfs(int f)
{
if((f==k)&&pd(sum))
{
++ans;
return ;
} for(int i=1;i<=n;i++)
{
if(!book[i])
{
sum+=a[i];
book[i]=1;
dfs(f+1);
book[i]=0;
sum-=a[i];
}
}
} int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(0); printf("%d\n",ans);
return 0;
}

在,为什么过不了样例?

然后猛然想起会有重复的算式。比如 1+2+3 在这题中和 1+3+2 是一样的

似乎没啥好办法。

然后猛然想起 cdcq 大佬以前似乎讲过一种“升序排列”的方法

具体叫啥窝也不记得了。。不过注意,这里不是说按照数值升序排列,而是按照下标。即,现找到下标为 1 ,然后一个一个往后退。比如拿样例来说:

4 3
3 7 12 19

按下标升序排列就是

3 7 12
3 7 19
3 12 19
7 12 19

也就是每次选择当前排列最末一个数在原序列位置后的一个数

于是就很喜闻乐见的 AC 了

#include <iostream>
#include <stdio.h> using namespace std; int n,k,a[21],ans,book[50000010]; int pd(int x)
{
for(int i=2;i<x;i++)
if(!(x%i))
return 0;
return 1;
} void dfs(int f,int sum,int now)
{
if((f==k)&&pd(sum))
{
++ans;
return ;
} for(int i=now;i<=n;i++)
dfs(f+1,sum+a[i],i+1);
return ; //搞完全部就退出
} int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(0,0,1); printf("%d\n",ans);
return 0;
}

【做题笔记】洛谷P1036 选数的更多相关文章

  1. (水题)洛谷 - P1036 - 选数

    https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...

  2. 【搜索】【入门】洛谷P1036 选数

    题目描述 已知 n个整数x1​,x2​,…,xn​,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...

  3. 洛谷 P1036 选数

    嗯.... 这种类型的题在新手村出现还是比较正常的, 但是不知道为什么它的分类竟然是过程函数与递归!!!(难道这不是一个深搜题吗??? 好吧这就是一道深搜题,所以千万别被误导... 先看一下题目: 题 ...

  4. 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举

    题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...

  5. 【洛谷P1036 选数】

    这个题显然用到了深搜的内容 让我们跟着代码找思路 #include<bits/stdc++.h>//万能头 ],ans; inline bool prime(int n)//最简单的判定素 ...

  6. 洛谷P1036.选数(DFS)

    题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...

  7. 洛谷P1036选数(素数+组合数)

    题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...

  8. 洛谷——P1036 选数

    题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...

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

    https://vijos.org/p/1128|| https://www.luogu.org/problem/show?pid=1036#sub 描述 已知 n 个整数 x1,x2,…,xn,以及 ...

随机推荐

  1. jQuery---三组基本动画 show hide

    三组基本动画 show hide //show不传参数,没有动画效果 $("div").show(); //show(speed) //speed:动画的持续时间 可以是毫秒值 还 ...

  2. jQuery---突出展示案例

    突出展示案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  3. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

  5. Gin_渲染

    1. 各种数据响应格式 package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gi ...

  6. [CQOI2009] 中位数 - 桶

    给出 \(1~n\) 的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 \(b\).中位数是指把所有元素从小到大排列后,位于中间的数. Solution (这个题为什么会被打上数学标签? ...

  7. Spring-session+Redis解决Session共享

    1. 保证Redis启动           2. 导入依赖                SpringBoot+Spring-Session+Redis <!--spring boot 与re ...

  8. dataTables插件的使用

    用到dataTables这个插件还是因为Metronic这个框架里有用到,不然我不会选择它的,为啥呢?就感觉它的文档有点复杂(当然,也有我智商不够用的原因):既然用了,那就说说我遇到的问题吧,以防下次 ...

  9. SpringMVC-简单参数绑定

    SpringMVC-简单参数绑定    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在 ...

  10. FJUTOJ-3682 LRU算法的实现2 (链表+哈希)

    传送门 此题让我们实现一个LRU的模板类.本题较简便且高效的写法是维护一个std::list和一个std::unordered_map. std::list 与 std::unordered_map ...