http://poj.org/problem?id=3211
题意:n种颜色,m件衣服;下面m行给出每件衣服需要的时间和衣服的颜色;两个人只能同时洗颜色相同的衣服;问洗完所有的衣服至少需要多少时间;
注意点:1、按颜色分组计算;2、对于某种颜色的衣服,每次选取两个人中用时较长的,在这些时间中再选取最小的;
#include<stdio.h>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxv = 100000+10;
const int maxc = 15;
map<string, int>mm;
vector<int>v[maxc];
int dp[maxv], sum[maxc];
int n, m;
int main()
{
while(~scanf("%d%d", &n, &m))
{
mm.clear();
for(int i = 1;i<=n;i++)
v[i].clear();
if(n == 0 && m == 0) break;
memset(sum, 0, sizeof sum);
for(int i = 1;i<=n;i++)
{
char s[15];
scanf("%s", s);
mm[s] = i;
}
for(int i = 1;i<=m;i++)
{
char s[15];
int t;
scanf("%d%s", &t, s);
v[mm[s]].push_back(t);
sum[mm[s]] += t;
}
int res = 0;
for(int i = 1;i<=n;i++)
{
memset(dp, 0, sizeof dp);
int ans = 1e9;
for(int t = 0;t<v[i].size();t++)
{
for(int j = sum[i];j>=v[i][t];j--)
{
dp[j] = max(dp[j], dp[j-v[i][t]]+v[i][t]);
}
}
for(int j = sum[i];j>=0;j--)
ans = min(ans, max(sum[i]-dp[j], dp[j]));
res += ans;
}
printf("%d\n", res);
}
return 0;
}