2016寒假训练——搜索
来源:互联网 发布:java泛型类型擦除 编辑:程序博客网 时间:2024/06/05 22:48
来源:HDU1518
一开始做这个题目还是觉的挺烦的,主要是要加个四个变量,然后比较,比较起来还比较麻烦。。。(绕口令,呵呵)。
首先,不需要找到的次序,而且M<=20,所以不会有爆栈的风险。
然后就是怎么去解决的问题,因为所有的木头都是整数,所以我们考虑这个问题,所以我们可以预见的是,一旦总和%4不为0的话,则一定是不可能。
下面就是dfs
DFS的技巧只有两步:
1.vis数组的改变的技巧
2.层数和条件的调用
AC代码(VJ提交):
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int m,l;const int MAXN=30;int a[MAXN];bool vis[MAXN];long long sum;bool dfs(int x,int pos,int len){ if(x==3)//x用来记录有多少枝了。。。因为如果有三枝和l相等,就不需要算最后一个了 return 1; int i; for(i=pos;i>=0;i--){//由于先排序了,所以我们不妨从最大的来进行一个枚举 if(!vis[i]){//标记,老方法了 vis[i]=1; if(len+a[i]<l){ if(dfs(x,i-1,len+a[i]))//还不够,所以继续搜索 return 1; } else if(len+a[i]==l){//匹配成功 if(dfs(x+1,m-1,0))//下一层搜索,其实pos==m-1,len归零 return 1; } vis[i]=0;//消除标记 } } return 0;//隐含是如果len+a[i]>l了,返回0}int main(){int c;scanf("%d",&c);while(c--) { sum=0; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&a[i]); sum+=a[i]; } sort(a,a+m); l=sum/4; memset(vis,0,sizeof(vis)); if(l*4!=sum ||m<4 || l<a[m-1])//剪枝 { //这一个技巧非常重要的 printf("no\n"); continue; } if(dfs(0,m-1,0))cout<<"yes"<<endl; else cout<<"no"<<endl; }return 0;}恩恩,这一题就这样。。。
1 0
- 2016寒假训练——搜索
- 2016寒假训练——搜索
- 2016寒假训练——寒假结束
- 寒假训练——POJ - 1562 Oil Deposits 搜索
- 2016寒假训练——二分
- 2016寒假训练——二分
- 2016寒假训练——二分
- 2016寒假训练——字典树
- 2016寒假训练——字典树
- 2016寒假训练——01背包
- 2016寒假训练——树状数组
- 2016寒假训练——线段树
- 2016寒假训练——数论
- 2016寒假训练——二分
- 2016寒假训练——尺取法
- 2016寒假训练——栈模拟
- 寒假训练——POJ - 2488 A Knight's Journey 搜索+贪心
- 2016寒假训练——二分(2)
- 二叉树的子结构
- slf4j--源码解析
- python 入门学习
- Android通知栏多条通知冲突的问题
- iOS开发中如何合理地制造BUG
- 2016寒假训练——搜索
- 修改灰色Bundle ID Bundle Identifier
- Unity for iOS 调用UIDatePicker
- Android View之--获取View大小时机
- 【Git】 添加 ssh key 到 git
- HDU 1016 Prime Ring Problem
- 23种设计模式(java)一
- 关于requirejs和grunt压缩合并是否矛盾
- nyoj组合数