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;
    }
  • 相关阅读:
    Linux常用命令大全
    CentOS安装Apche+Mysql+PHP
    ThinkPHP5.1设置404页面
    ThinkPHP5 循环标签
    deepin下安装apache+php+mysql
    deepin安装
    PHP中的http协议
    JSP四个作用域
    application跟session的区别
    jsp内置对象--session
  • 原文地址:https://www.cnblogs.com/rainydays/p/2807860.html
Copyright © 2011-2022 走看看