dfs
来源:互联网 发布:使用excel制作软件 编辑:程序博客网 时间:2024/06/06 01:48
1、团队程序设计天梯赛-练习集-L3-001 凑零钱
参考:http://blog.csdn.net/chan_yeol/article/details/51362182
解题思路:
dfs + 剪枝
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>#include <cctype>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const ull mod = 1e9 + 7;const int INF = 0x7fffffff;const int maxn = 1e4 + 10;int N, M;int num[maxn];int sum = 0;int ans[maxn];int Count = 0;bool dfs(int sum, int pos, int leave);int main(){#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H scanf("%d%d", &N, &M); for (int i = 0; i < N; ++i) { scanf("%d", &num[i]); sum += num[i]; } sort(num, num+N); bool flag = false; for (int i = 0; i < N; ++i) { if (dfs(num[i], i, sum)) { flag = true; printf("%d", num[i]); for (int j = Count-1; j >= 0; --j) { printf(" %d", ans[j]); } printf("\n"); break; } } if (!flag) { printf("No Solution\n"); } return 0;}bool dfs(int sum, int pos, int leave){ if (sum > M || num[pos] > M) { return false; } if (sum == M) { return true; } leave -= num[pos]; for (int i = pos+1; i < N; ++i) { if (sum+num[i] > M || leave+sum < M) { //剩下的不足时不再进行搜索 return false; } if (sum+num[i] == M) { ans[Count++] = num[i]; return true; } if (dfs(sum+num[i], i, leave)) { ans[Count++] = num[i]; return true; } } return false;}
2、Codeforces 217A Ice Skating
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <map>#include <queue>#include <stack>#include <set>#include <bitset>#include <ctime>#include <cctype>using namespace std;#define lson low, mid, _id<<1#define rson mid + 1, high, _id<<1|1typedef long long ll;typedef unsigned long long ull;typedef pair<int, int> Pair;const int mod = 1e9 + 7;const int INF = 0x7fffffff;const int maxn = 100 + 10;int n, cnt = 0;int x[maxn], y[maxn];bool vis[maxn];void dfs(int a, int b);int main() {#ifdef Floyd freopen("in.txt", "r", stdin);#endif scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d %d", &x[i], &y[i]); } memset(vis, false, sizeof(vis)); for (int i = 0; i < n; ++i) { if (!vis[i]) { ++cnt; dfs(x[i], y[i]); } } printf("%d\n", cnt - 1); return 0;}void dfs(int a, int b) { for (int i = 0; i < n; ++i) { if (!vis[i] && (a == x[i] || b == y[i])) { vis[i] = true; dfs(x[i], y[i]); } }}
0 0
- DFS
- DFS
- dfs
- dfs
- dfs
- dfs
- DFS
- DFS
- dfs
- DFS
- DFS
- DFS
- dfs
- DFS
- dfs
- dfs
- dfs
- dfs
- error: ‘PATH_MAX’ undeclared (first use in this function)
- c#中将json数据转换为dictionary并取出某个元素显示
- Redis学习笔记(九)redis 配置文件详解
- NSURLSession的下载和断点继传以及后台下载功能
- 夜半游白岛心安随笔记
- dfs
- win7下的ie11开发者工具报错
- webstrom 2016.1 破解链接
- NSIS FQA
- MongoDB 命令笔记
- ARM、X86/Atom、MIPS、PowerPC
- Extjs 解决表单提交总是执行failure回调函数
- 8.4 聚类(Clustering) hierarchical clustering 层次聚类应用
- Zabbix之配置文件详解