• 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;
    }
  • 相关阅读:
    二叉树
    队列
    python3使用pdfminer3k解析pdf文件
    得到手机版新闻解析
    python连接redis并插入url
    Python使用requirements.txt安装类库
    (1366, "Incorrect string value: '\xF3\xB0\x84\xBC</...' for column 'content' at row 1")
    mysql中Incorrect string value乱码问题解决方案
    mysql命令
    requests ip代理池单ip和多ip设置方式
  • 原文地址:https://www.cnblogs.com/rainydays/p/2113594.html
Copyright © 2020-2023  润新知