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
原创粉丝点击