poj3211

01背包

View Code
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

using namespace std;



#define maxn 105

#define maxm 15

#define maxl 50

#define maxt maxn * 1000



struct Cloth

{

    int t, c;

}cloth[maxn];



int m, n;

char color[maxm][maxl];

bool f[maxt];



bool operator < (const Cloth &a, const Cloth &b)

{

    return a.c < b.c;

}



int getid(char *a)

{

    for (int i = 0; i < m; i++)

        if (!strcmp(a, color[i]))

            return i;

    return -1;

}



void input()

{

    for (int i = 0; i < m; i++)

        scanf("%s", color[i]);

    for (int i = 0; i < n; i++)

    {

        char temp[maxl];

        scanf("%d%s", &cloth[i].t, temp);

        cloth[i].c = getid(temp);

    }

}



int bag(int w[], int num, int sum)

{

    memset(f, 0, sizeof(bool) * (sum + 1));

    f[0] = true;

    for (int i = 0; i < num; i++)

        for (int j = sum; j - w[i] >= 0; j--)

            f[j] = f[j] || f[j - w[i]];

    int ret = sum;

    while (!f[ret])

        ret--;

    return ret;

}



void work()

{

    int l = 0;

    int wash[maxn];

    int ans = 0;

    for (int i = 0; i < m; i++)

    {

        int x = 0;

        int sum = 0;

        while (cloth[l].c == i)

        {

            wash[x++] = cloth[l].t;

            sum += cloth[l].t;

            l++;

        }

        ans += sum - bag(wash, x, sum / 2);

    }

    printf("%d\n", ans);

}



int main()

{

    //freopen("t.txt", "r", stdin);

    while (scanf("%d%d", &m, &n), m | n)

    {

        memset(cloth, -1, sizeof(cloth));

        input();

        sort(cloth, cloth + n);

        work();

    }

    return 0;

}

你可能感兴趣的:(poj)