poj 3211 Washing Clothes

#include<iostream>        //0-1背包问题
#include<map>
#include<vector>
#include<string>
using namespace std;
int main()
{
int m,n,p,s[12],dp[200000],sum; //dp[x]=y表示总时间为x,其中在洗衣服的时间最多为 y
int i,j,k;
string color;
while(cin>>m>>n&&m&&n)
{
map<string ,int> col;
map<string ,int>::iterator ite;
vector<int> vec[12];
for(i=0;i<m;++i)
{
cin>>color;
col.insert(make_pair(color,i));
}
memset(s,0,sizeof(s));
sum=0;
for(i=0;i<n;++i)
{
cin>>p>>color;
ite=col.find(color);
vec[ite->second].push_back(p);
s[ite->second]+=p;
}
for(i=0;i<m;++i) //对每种颜色进行DP,容量c为s[i]/2,求出最接近c的值.
{
memset(dp,0,sizeof(dp));
int c=s[i]/2;
for(j=0;j<vec[i].size();++j)
for(k=c;k>=vec[i][j];--k)
dp[k]=max(dp[k],dp[k-vec[i][j]]+vec[i][j]);
sum+=s[i]-dp[c]; //s[i]-dp[c] 作为洗该颜色衣服的最短时间
}
cout<<sum<<endl;
}
return 0;
}
//题意:两个人洗衣服,衣服的种类m种颜色,共有n件,每种颜色的衣服要分开洗,两个人只能同时洗同种颜色的衣服,只有等一种颜色的衣服洗完之后才能继续洗下一种。
//所以只要分别求每种颜色衣服最大的洗完时间,然后相加即可!
//对于每种不同颜色衣服,要尽量将不同衣服的不同浆洗时间均匀的分摊到两人身上,
//即对于同颜色的衣服,假设一个人洗共耗时 T,则最短的时间便是其中有一个人的浆洗时间必须尽可能的接近T/2,
//假设为t,则 T-t 便是最短的时间。这其实就是一个容量为T/2的背包问题。

posted on 2011-07-22 16:43  sysu_mjc  阅读(132)  评论(0编辑  收藏  举报

导航