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;
}
原文地址:https://www.cnblogs.com/kedebug/p/2871862.html