题目大意:
有n种颜色的衣服,每一种颜色的衣服有好多件,洗衣服的时候可以俩个人同时洗,但是必须洗完一种颜色才可以洗另外一种颜色,问洗完所有衣服需要的最短时间是多少;
解题思路:
dp【i】表示花费时间i可以获得最大价值,价值和花费都为洗衣服的时间;
洗一些衣服,可以俩个人同时洗,那么最快会多快呢?最优情况是一个洗完这些衣服所用时间的一半;
因此,我们在洗每一种衣服的时候,进行一次0-1背包,容量为总时间的一半,那么最短时间就是max(dp【sum/2】,sum-dp[sum/2]);
最后我们只需把这n种花费加和即可;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
vector<int> cloth[11];
for(int i=0;i<11;i++)
cloth[i].clear();
int sum[11]={0};
string color[11];
for(int i=0;i<n;i++)
cin>>color[i];
for(int i=0;i<m;i++)
{
int num;
string s;
cin>>num>>s;
for(int j=0;j<n;j++)
{
if(s==color[j])
{
cloth[j].push_back(num);
sum[j]+=num;
break;
}
}
}
int ans=0;
for(int i=0;i<n;i++)
{
int v=sum[i]/2;
int dp[100010]={0};
for(int j=0;j<cloth[i].size();j++)
for(int k=v;k>=cloth[i][j];k--)
dp[k]=max(dp[k],dp[k-cloth[i][j]]+cloth[i][j]);
ans+=max(dp[v],sum[i]-dp[v]);
}
printf("%d\n",ans);
}
}