pku 1010 dfs

 

//dfs 做了两天 调试了半天 发现va 是关键字说 突然变0了 自己ubuntu上的g++题目给的数据都没过 提交竟ac了说 

#include <iostream>

#include <algorithm>
using namespace std;

int value[10010], customer[10010], cnt[50];
int av, result, types, flag, maxvalue, re[4];
int retypes, remaxvalue, renum, num[4];
void check(int now)
{
    maxvalue = types = 0;
    int i, j;
    for (i = 0; i < now; ++i)
    {
        if (value[re[i]] > maxvalue)
        {
            maxvalue = value[re[i]];
        }
        bool flag = true;
        for(j = 0; j < i; j++)
        {
            if(re[i] == re[j])
            {
                 flag = false;
            }
        }
        if(flag)
        {
            types++;
        }
    }
}

void dfs(int pos, int now, int n)
{
    if (now > 4)
    {
        return;
    }
    else if (result == 0)
    {
        check(now);
        if (types > retypes || (types == retypes && now < renum) || (types == retypes &&
            now == renum && maxvalue > remaxvalue))
        {
                retypes = types;
                renum = now;
                remaxvalue = maxvalue;
                int j;
                for (j = 0; j < now; ++j)
                {
                    num[j] = re[j];
                }
                flag = 0;
        }
        else if (types == retypes && now == renum && maxvalue == remaxvalue)
        {
            flag = 1;
        }
        return;
    }
    else
    {
        int i;
        for (i = pos; i < n; ++i)
        {
            result -= value[i];
            if (result >= 0)
            {
                re[now++] = i;
                dfs(i, now, n);
                now--;
            }
            result += value[i];
        }
    }
}

int main()
{
    int a, b, i, n;
    while (scanf("%d", &a) != EOF && a)
    {
        memset(cnt, 0, sizeof(cnt));

        cnt[a]++;
        value[0] = a;
        n = 1;
        while (scanf("%d", &a) != EOF && a)
        {
            if (cnt[a] < 4)
            {
                cnt[a]++;
                value[n++] = a;
            }
        }
        sort(value, value + n);
        av = 0;
        while (scanf("%d", &b) != EOF && b)
        {
            customer[av++] = b;
        }

        for (i = 0; i < av; ++i)
        {
            printf("%d ", customer[i]);
            result = customer[i];
            memset(re, -1 ,sizeof(re));
            retypes = 0;
            remaxvalue = 0;
            renum = 5;
            flag = 0;
            dfs(0, 0, n);
            if (retypes)
            {
                printf("(%d):", retypes);
                if (!flag)
                {
                    int j;
                    for (j = 0; j < renum; ++j)
                    {
                        printf(" %d", value[num[j]]);
                    }
                    printf("\n");
                }
                else
                {
                    printf(" tie\n");
                }
            }
            else
            {
                printf("---- none\n");
            }
        }
    }
    return 0;
}

posted on 2009-04-21 15:57  ZAFU_VA  阅读(388)  评论(0)    收藏  举报

导航