链接戳这里

这道题呢 是一个入门深搜  看到题目很明显的dfs

但是今天好好研究了下这道题  主要是想学习理解下剪枝的思想

题目

给你n个数(a1,a2,a3.......an) ,是否存在某一些数字加起来等于k,有就输出 "YES",否则输出 "NO"。

数据范围:n<20;          a1+a2+....an在int范围里面.

多组输入,每组第一行输入两个数n,k,第二行输入n个数a1 a2 ...... an

输出  如果存在一些数加起来为k输出"YES";否则输出"NO".

看范围  只有20个数  直接深搜也不会超时   但是我们通过这个题 可以理解下剪枝的思想

DFS的方法就不多说了  大家自己看代码   下面给出 两种未剪枝的DFS代码

时间消耗 492

//时间 492
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int v[maxn],a[maxn],flag,sum,n,k;
void dfs(int x){if(sum==k){flag=1;return;}for(int i=x;i<=n;i++){sum+=a[i];dfs(i+1);sum-=a[i];}
}
int main(){while(~scanf("%d%d",&n,&k)){memset(a,0,sizeof(a));memset(v,0,sizeof(v));flag=0;sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}dfs(1);sum=0;if(flag==0)printf("NO\n");else printf("YES\n");}return 0;
}

  时间消耗340

// 时间 340
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100],sum,n,k;
bool dfs(int x,int sum){if(x==n) return sum==k;if(sum==k) return true;if(dfs(x+1,sum))return true;if(dfs(x+1,sum+a[x+1]))return true;return false;
}
int main(){while(~scanf("%d%d",&n,&k)){memset(a,0,sizeof(a));sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}if(dfs(0,sum))printf("YES\n");else printf("NO\n");}return 0;
}

剪枝

这两种DFS  一个时间是492    一个是340

那么剪枝 就是深搜过程中 对于某些肯定不可能的情况就不要深入搜索了

比如这道题  找一部分数的和等于k  那么我们从小到大排序  从头开始找 

如果加上当前位置的数字后  sum大于k了 那么就不要往下找了 因为下面的数字  都比当前位置的大  肯定不行

所以 我们给这两种DFS 加个排序 再剪枝一下

根据OJ的反馈   第一种方法优化后时间为32    第二种优化后时间为12   大大的减少了时间消耗

其他的DFS题目  我们要学会根据题意 找出不可能的状态  对我们的DFS剪枝优化

优化后

时间消耗 32  剪枝处在代码中有标示

//时间 32
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int v[maxn],a[maxn],flag,sum,n,k;
void dfs(int x){if(sum==k){flag=1;return;}if(sum>k)return ;//剪枝!for(int i=x;i<=n;i++){sum+=a[i];dfs(i+1);sum-=a[i];}
}
int main(){while(~scanf("%d%d",&n,&k)){memset(a,0,sizeof(a));memset(v,0,sizeof(v));flag=0;sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);dfs(1);sum=0;if(flag==0)printf("NO\n");else printf("YES\n");}return 0;
}

时间消耗 12  剪枝处在代码中有标示

// 时间 12
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100],sum,n,k;
bool dfs(int x,int sum){if(x==n) return sum==k;if(sum==k) return true;if(sum>k) return false;//剪枝!if(dfs(x+1,sum))return true;if(dfs(x+1,sum+a[x+1]))return true;return false;
}
int main(){while(~scanf("%d%d",&n,&k)){memset(a,0,sizeof(a));sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);if(dfs(0,sum))printf("YES\n");else printf("NO\n");}return 0;
}

NYOJ1282部分和问题--DFS剪枝入门相关推荐

  1. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  2. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  3. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  4. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  5. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  6. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  7. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  8. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

  9. 洛谷 P1433 吃奶酪 dfs剪枝

    洛谷 P1433 吃奶酪 dfs剪枝 题解: dfs+剪枝,不过现在好像被卡时间了,第10个点过不了.. 代码如下: #include<iostream> #include<algo ...

  10. 牛客算法周周练17D - 刺客信条(dfs剪枝 | 优先队列 + bfs)

    题目大意: 给出一张n * m的地图,每经过一个建筑都需要一定的时间,而经过ABC要花费100,要求输出从S到E的最短时间. 解题思路: 思路一:dfs剪枝 输入地图的时候用char输入,然后转成in ...

最新文章

  1. Spring 教程(三) 环境设置
  2. C语言中的变量是怎么回事?
  3. django中collectstatic的使用(亲测)
  4. Linux rpm 命令
  5. MySQL下使用Inplace和Online方式创建索引的教程
  6. 7-11 堆栈操作合法性 (20 分)以及堆栈讲解(c语言实现)
  7. 正则表达式之量词(重复出现)?、*、+
  8. 比较好玩的动态添加网页元素
  9. 3. beeGo 自己写Controller 和 请求数据处理
  10. 为什么在12306买火车票要装根证书?
  11. 阿里面试整个流程(已OC)
  12. python社团宣传语_宣传语_Python语言及其应用_红黑联盟读书频道
  13. win10拨号上网开启热点
  14. 修改PPT导出图片DPI值
  15. [附源码]计算机毕业设计JAVA逸尘房屋销售管理系统
  16. 腾讯 Code Review 规范出炉!
  17. 游戏装备mysql表设计_Game游戏数据库人物表,装备表,技能表
  18. 手把手教学使用Halo搭建自己的博客网站
  19. ElasticSearch7.10配置Search-Guard之配置用户
  20. 干货分享,4款安卓小众软件,每一个都值得保留

热门文章

  1. SSDP:DDoS***的“新宠”
  2. javaSE---最大值最小值和冒泡排序及随机数的讲解
  3. DirectX 9高层着色语言介绍4——语言基础(3)
  4. 10个线程同时执行i++操作1000次,如何保证结果是1w
  5. Cannot detect Web Project version. Please specify version of Web Project through Maven project ...报错
  6. day01 格式化输出和while循环的两个小练习
  7. RESTful API 设计规范
  8. 基于天然概率的无需人为平衡的skiplist的美之展现
  9. Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
  10. MySQL 5.6 关于登陆的初始化设置