zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    文件系统操作与磁盘管理
    文件打包与解压缩
    环境变量与文件查找
    Linux目录结构及文件基本操作
    vim3
    vim2
    vim1
    用户管理
    初识
    第一章
  • 原文地址:https://www.cnblogs.com/kedebug/p/2871862.html
Copyright © 2011-2022 走看看