POJ 3211 Washing Clothes(01背包变型)

题意:

有 m 种颜色的 n 件衣服,不同种颜色的必须分开洗,并且必须一种颜色洗完才能洗另外一种。2个人同时开工,问最少需要多少时间洗完。

思路:

1. 把问题缩小规模,即每一种颜色的衣服最少需要多长能完成

2. 由于是 2 个人同时开工的,所以把背包容量缩小一半,能装多少衣服即是其中一个人需要的时间。

3. 对问题 01 背包即可。

 

#include <iostream>

#include <vector>

#include <map>

#include <string>

using namespace std;



const int maxd = 50010;

const int maxn = 11;



map<string, int> mp;

vector<int> w[maxn];

int dp[maxd];



int main()

{

    int m, n;

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

    {

        string s;

        mp.clear();

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

        {

            cin >> s;

            mp[s] = i;

            w[i].clear();

        }

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

        {

            int t;

            cin >> t >> s;

            w[mp[s]].push_back(t);

        }



        int ret = 0;

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

        {

            int sum = 0;

            for (int j = 0; j < w[i].size(); ++j)

                sum += w[i][j];



            memset(dp, 0, sizeof(int) * (sum + 1));



            for (int j = 0; j < w[i].size(); ++j)

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

                    dp[v] = max(dp[v], dp[v-w[i][j]] + w[i][j]);



            ret += sum - dp[sum>>1];

        }

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

    }

    return 0;

}

你可能感兴趣的:(poj)