【做题笔记】洛谷P1036 选数
作为一个 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 选数的更多相关文章
- (水题)洛谷 - P1036 - 选数
https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...
- 【搜索】【入门】洛谷P1036 选数
题目描述 已知 n个整数x1,x2,…,xn,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...
- 洛谷 P1036 选数
嗯.... 这种类型的题在新手村出现还是比较正常的, 但是不知道为什么它的分类竟然是过程函数与递归!!!(难道这不是一个深搜题吗??? 好吧这就是一道深搜题,所以千万别被误导... 先看一下题目: 题 ...
- 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举
题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...
- 【洛谷P1036 选数】
这个题显然用到了深搜的内容 让我们跟着代码找思路 #include<bits/stdc++.h>//万能头 ],ans; inline bool prime(int n)//最简单的判定素 ...
- 洛谷P1036.选数(DFS)
题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...
- 洛谷P1036选数(素数+组合数)
题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...
- 洛谷——P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 洛谷—— P1036 选数 || Vijos——选数
https://vijos.org/p/1128|| https://www.luogu.org/problem/show?pid=1036#sub 描述 已知 n 个整数 x1,x2,…,xn,以及 ...
随机推荐
- layui radio手动选择失效的问题
var radio_types = document.getElementsByName("radio_type"); for (var i = 0; i < radio_t ...
- java课堂测试
package 作业2; //信1805-1 杨一帆 20183608 public class ScoreInformation1 { private String stunumber; pr ...
- vjudge Lake Counting 搜索 水池 8方向
原题链接https://vjudge.net/contest/331118#problem/A 题目: 现在有一个M*N的方阵,每个格子里面是.或者W,点代表水,然后如果在这个点的周围,即8个方向内还 ...
- 一个简单的java web项目 仅实现添加
连接数据库已经进行判断 要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分 ...
- swagger2使用
添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swag ...
- 牛客CSP-S提高组赛前集训营3 赛后总结
货物收集 二分答案.复杂度\(O(n\log n)\). 货物分组 用费用提前计算的思想,考虑用一个新的箱子来装货物会发生什么. 显然费用会加上后面的所有货物的总重. \(60\)分的\(O(n^2) ...
- java多线程CountDownLatch
先上一个介绍:https://blog.csdn.net/shihuacai/article/details/8856370 用视频https://www.bilibili.com/video/av8 ...
- mysql视图的创建、基本操作、作用
一.mysql视图的创建 作用:提高了重用性,就像一个函数.如果要频繁获取user的name和goods的name.就应该使用以下sql语言.示例: 先创建3张表 1.1user表 1.2goods表 ...
- R parallel包学习笔记2
这个部分我在datacamp上面学习笔记,可视化的性能很差,使用的函数也很少. 可以参考一下大佬的博客园个人感觉他们讲的真的很详细 https://cosx.org/2016/09/r-and-par ...
- Unable to load authentication plugin 'caching_sha2_password'
Caused by: com.mysql.cj.core.exceptions.WrongArgumentException: Unable to load authentication plugin ...