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;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------