zoukankan      html  css  js  c++  java
  • poj1010

    dfs

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    #define maxn 300
    
    int n;
    int m, tot;
    int stamp[maxn];
    int ans[5], ansnum;
    int sel[5];
    bool tie, none;
    bool vis[maxn];
    
    void input()
    {
        n = 1;
        if (scanf("%d", &stamp[0]) == EOF)
            exit(0);
        while (scanf("%d", &stamp[n]), stamp[n])
            n++;
    }
    
    int cal(int a[], int n)
    {
        int ret = 0;
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < n; i++)
            if (!vis[a[i]])
            {
                vis[a[i]] = true;
                ret++;
            }
        return ret;
    }
    
    int getmax(int a[], int n)
    {
        int ret = 0;
        for (int i = 0; i < n; i++)
            ret = max(ret, stamp[a[i]]);
        return ret;
    }
    
    void compare()
    {
        int ksel = cal(sel, tot);
        int kans = cal(ans, ansnum);
        int maxans = getmax(ans, ansnum);
        int maxsel = getmax(sel, tot);
    
        if (ansnum == -1 || ksel > kans || (ksel == kans && ansnum > tot) || (ksel
                == kans && ansnum == tot && maxans < maxsel))
        {
            tie = false;
            ansnum = tot;
            for (int i = 0; i < tot; i++)
                ans[i] = sel[i];
            return;
        }
        if (ksel == kans && ansnum == tot && maxans == maxsel)
            tie = true;
    }
    
    void dfs(int now, int money)
    {
        if (money > m)
            return;
        if (money == m)
        {
            none = false;
            compare();
        }
        if (tot == 4)
            return;
        for (int i = now; i < n; i++)
        {
            sel[tot] = i;
            tot++;
            dfs(i, money + stamp[i]);
            tot--;
        }
    }
    
    void print()
    {
        if (none)
        {
            printf("%d ---- none\n", m);
            return;
        }
        printf("%d (%d):", m, cal(ans, ansnum));
        if (tie)
        {
            printf(" tie\n");
            return;
        }
        for (int i = 0; i < ansnum; i++)
            printf(" %d", stamp[ans[i]]);
        putchar('\n');
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        while (1)
        {
            input();
            sort(stamp, stamp + n);
            while (scanf("%d", &m), m)
            {
                tot = 0;
                ansnum = -1;
                tie = false;
                none = true;
                dfs(0, 0);
                if (!none)
                    sort(ans, ans + ansnum);
                print();
            }
        }
        return 0;
    }
  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/rainydays/p/2807860.html
Copyright © 2011-2022 走看看