![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
深搜的剪枝技巧
穷源溯流
路很长,尽管走便是。
展开
-
C2. Good Numbers (hard version)
如果一个数 n 可以被分解为多个 3^x 相加的结果,就是一个好数,其中 x 是任意数,但是不能重复,所以要求寻找最小的好数 m>= n,输出 m当然这里先打表,求出任意 3^x 的值,这个题就变成了曾经做过的一个题(和为 K 的组合),有兴趣的可以看一下,对于本题没大有帮助,这样暴力深搜就可以了,但是无疑 T 了超时代码: ll n,m,t; int i,j,k; ll a[40]; int cur=1; bool vis[40]; ...原创 2020-07-11 14:12:19 · 327 阅读 · 0 评论 -
HDU 5887 Herbs Gathering(背包问题的剪枝技巧)
一个典型的背包问题,但是没办法开那么大的数组,我们先按照效率进行排序,利用搜索DFS但需要剪枝:如果按照把剩余的物品尽量拿走(时间够则全拿,不够则按比例拿)其价值也不超过当前最优解则不需要继续深搜索const int N=100+5; int n,m; double t; int i,j,k; ll ans; struct Node { ll t,val; double rate; bool ...原创 2020-07-05 14:45:56 · 316 阅读 · 0 评论 -
POJ 2362 && HDU 1518 Square
给 n 个木棒的长度,问能否拼成正方形(不许裁剪)其实思路很好想,但是有几处剪枝要注意: 所有木棍都要用上,越长的木棍灵活度越小,所以要先用长的。 当 sum 不能整除时,或最长的木棍比边长还长时,显然不可以 当凑齐了三条边时,若满足 sum 可以整除,第四条边就不需要计算了 木棍必须有 4 根或以上 const int N=20+5; int n,m,t; int i,j,k; int a[N]; bool vi...原创 2020-07-04 11:17:45 · 294 阅读 · 0 评论 -
THDU 1010 empter of the Bone(奇偶剪枝+DFS)
Sample OutputNOYES我们定义剩余时间为 res ,如果剩余时间很多且res 为奇数那么必然不可能恰好到达,因为每多拐一个弯则必然多出偶数步,所以 res 与 距离终点的格子数应该具有相同的奇偶性。#pragma GCC optimize(2)#include <bits/stdc++.h>/*#include <iostream>#include <cmath>#include <cstdio>#includ...原创 2020-07-03 19:35:27 · 246 阅读 · 0 评论 -
HDU 5305 Friends(图+DFS)
Friends有 n 个人,m 组朋友,要求每个人有一半的朋友在线,一半的朋友不在线,求多少种可能。如果一个人有奇数个朋友,显然是不成立的若都有偶数个,我们先假设两种状态的朋友各有一半,然后借用 m 种关系,使得其成立即可const int N=100+5; int n,m,t; int i,j,k; int a[N],b[N]; int num[N]; Pair G[N]; int ans;void DFS(int step){...原创 2020-07-03 15:20:51 · 162 阅读 · 0 评论 -
1068:和为 k 的组合
const int N=1e5+5; int n,m,t; int i,j,k; int a[N]; bool flag; bool vis[N]; void DFS(int cur,int sum){ if(sum>k) return ; if(sum==k){ flag=0; return ; } for(int i=cur+1;i<=n;i++){ //剪枝,从 cur 之前的数开始搜索的都没有结果 ...原创 2020-06-30 15:12:03 · 254 阅读 · 0 评论 -
1447:靶形数独(可行性剪枝 ~好题)
【题目描述】const int N=11+5;const int grade[10][10]{{0,0,0,0,0,0,0,0,0,0},{0,6,6,6,6,6,6,6,6,6},{0,6,7,7,7,7,7,7,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,9,10,9,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,7,7,7,..原创 2020-06-28 20:27:00 · 372 阅读 · 0 评论 -
P1118 [USACO06FEB]Backward Digit Sums G/S(杨辉三角)
这个数字三角形就是著名的杨辉三角这样我们与处理好杨辉三角的系数一步步递归求解 a,b,c,d,e 的字典序最小即可,即最先搜索到的const int N=22+5; int n,m,t; int i,j,k; int minn; bool vis[N]; int triangle[N][N]; //杨辉三角的系数 int a[N]; //记录答案void DFS(int step,int sum) //第一层中的第 step...原创 2020-06-28 17:36:39 · 468 阅读 · 0 评论 -
洛谷 P1433 吃奶酪
#define fr first#define sc secondconst int N=222+5; int n,m,t; int i,j,k; double minn; pair<double,double> p[N]; double dis[N][N]; bool vis[N];void DFS(int num,int now,double len) //已经吃过 num 块奶酪,当前处于 now 的位置及本次搜索的答案{...原创 2020-06-28 16:12:24 · 238 阅读 · 0 评论 -
1443:Addition Chains
const int N=1e5+5; int n,m,t; int i,j,k; int minn=inf; int a[N],ans[N],len;void DFS(int step){ if(step>len) return ; if(a[step]>n) return ; if(a[step]==n){ if(step>=len) return ; len=step; ...原创 2020-06-26 22:38:37 · 279 阅读 · 0 评论 -
1441:生日蛋糕
int n,m,t; int i,j,k; int minn=inf;void DFS(int num,int volume,int area,int r,int h){ if(num==m){ if(volume==n) minn=min(minn,area); return ; } if(volume+(r-1)*(r-1)*(h-1)*(m-num) < n) return ; if(vol...原创 2020-06-26 21:38:20 · 419 阅读 · 0 评论 -
1440:数的划分
int n,m,t; int i,j,k; int a[N],ans=0;void DFS( int K ) //分第 K 份{ if( n == 0 ) return ; if( K == m ){ if ( a[k-1] <= n ) ans++; return ; } for( int i = a[K-1] ; i <= n/(m-K+1) ; i++ ){ a[K]...原创 2020-06-22 22:21:46 · 311 阅读 · 0 评论