ACdream1726 DFS大好题!!!!!
2015-08-06 20:30
211 查看
————我是链接—————
这道DFS题目一看上去就有思路因为这直接排个序一路加过去就行了,但是这个题目定的实在是太好了
稍微姿势不对就会WA或者超限,而且这里考到的剪枝知识让我大开眼见
刚开始排序排反了,WA了几发,后来剪枝剪得不好又超时了几发
后来想到了一个方法,就是存一个数组,如果后面连续的的数小于rest那么就没有搜下去的必要的,直接return false
我做的那叫一个红光满面,酣畅淋漓。
来一发又臭又长的的代码
这道DFS题目一看上去就有思路因为这直接排个序一路加过去就行了,但是这个题目定的实在是太好了
稍微姿势不对就会WA或者超限,而且这里考到的剪枝知识让我大开眼见
刚开始排序排反了,WA了几发,后来剪枝剪得不好又超时了几发
后来想到了一个方法,就是存一个数组,如果后面连续的的数小于rest那么就没有搜下去的必要的,直接return false
我做的那叫一个红光满面,酣畅淋漓。
来一发又臭又长的的代码
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int sum[55];int n,m; long long a[55];long long num; bool cmp(long long a,long long b) { return a>b; } bool dfs(int pos,long long rest) { int i; if(rest==0) return true; else if(rest>sum[pos])//A了觉得没事做的可以把这行和return false注销了试一试 return false; for(i=pos;i>=0;i--) { if(a[i]>rest)continue; if(rest==a[i])return true; if(i!=0) { if(dfs(i-1,rest-a[i])) return true; } else { if(rest==a[i]) return true; return false; } } return false; } int main() { int i; while(scanf("%d%lld",&m,&num)!=EOF) { n=0; memset(sum,0,sizeof(sum)); memset(a,0,sizeof(a)); long long r; for(i=0;i<m;i++) { scanf("%lld",&r); if(r>num)continue; a[n++]=r; } sort(a,a+n); for(i=0;i<n;i++) { if(i==0) sum[i]=a[i]; else sum[i]=sum[i-1]+a[i]; } if(dfs(n-1,num)) { printf("Yes\n"); } else printf("No\n"); } return 0; }
相关文章推荐
- JavaScript基础----25JS事件详解-事件对象
- 浅谈算法和数据结构: 十二 无向图相关算法基础
- Codeforces Round 313- Gerald's Hexagon
- Python 之 LIBSVM 使用小结(二)
- HDU5363_____Key Set
- HDU5363_____Key Set
- JqueryMobile 跳转问题
- Spring框架原理(一)-- IOC与AOP
- JavaScript基础----24JS事件详解-事件处理
- JavaScript基础----23JS事件详解-事件流
- python: 怎样写一个函数把名字大写并变成下面这样——字典与三引号
- linux不同gcc/G++版本之间的切换
- 浅谈jsp、freemarker、velocity区别
- java中与mysql连接详细操作
- C++中你仍然不知道的事
- 一日一笑话
- 在c#中使用servicestackredis操作redis
- codeforces 315 308
- 杭电acm 2309 ICPC Score Totalizer Software
- C语言中的可变参数。