题目大意:两个人同时洗一种颜色的衣服 洗完才能洗下一种颜色的衣服 求把所有种类的衣服洗完最少时间
题解:把每种颜色的衣服转化为必须装满的背包 求最接近每种颜色衣服总时间sum[i]/2的值即dp[mid]
把sum-dp[mid]累加就是答案
#include <iostream>
#include<cstring>
using namespace std;
char color[12][21],temp[21];
bool dp[100000];
int h[12][100],sum[12],t[12];
int getid(char *a)
{
for(int i=1; i<12; i++)
if(strcmp(color[i],a)==0)
return i;
return 0;
}
int main()
{
int m,n,time;
while(cin>>m>>n&&(m+n))
{
for(int i=1; i<=m; i++)
cin>>color[i],sum[i]=t[i]=0;
for(int j=1; j<=n; j++)
{
cin>>time>>temp;
int k=getid(temp);
h[k][t[k]++]=time;
sum[k]+=time;
}
int ans=0;
for(int i=1; i<=m; i++)
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int j=0; j<t[i]; j++)
for(int k=sum[i]-h[i][j]; k>=0; k--)
if(dp[k])
dp[k+h[i][j]]=1;
for(int j=sum[i]/2; j>=0; j--)
if(dp[j])
{
ans+=(sum[i]-j);
break;
} //也可以像底下这么写
/* for(int j=sum[i]%2?sum[i]/2+1:sum[i]/2; j<=sum[i]; j++)
if(dp[j])
{
ans+=j;
break;
}*/
}
cout<<ans<<endl;
}
return 0;
}