0-1背包之二

#include<iostream>        //POJ 3211 Washing Clothes
#include<map>
#include
<vector>
#include
<string>
using namespace std;
int main()
{
int m,n,p,s[12],dp[200000],sum; //因为不必记录路径,所以dp数组用一维的就行
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)); //dp[x]=y表示容量为x,最多可容纳 y clothes
int c=s[i]/2;
for(j=0;j<vec[i].size();++j)
for(k=c;k>=vec[i][j];--k) //注意k是从大到小,如果从小到大,那么因为dp[k-vec[i][j]]的值已经改变而发生错误
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;
}

  

posted on 2011-08-22 11:43  sysu_mjc  阅读(130)  评论(0编辑  收藏  举报

导航