题意:给出n种颜色,m件衣服,再分别给出m件衣服的颜色,和洗所需要的时间,dearboy和他的妹子一起洗衣服,且同种颜色的衣服不能同时洗,也不能两个人同时洗一件衣服,问洗完这m件衣服至少需要的时间
先考虑怎样才能让时间最少的方案,肯定是dearboy和他的妹纸各洗一半的时间,这样消耗的时间最少,
这样可以联想到杭电那一道big event in HDU,平均划分背包容量来做。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<map> 6 #include<algorithm> 7 using namespace std; 8 9 typedef long long LL; 10 char color[15]; 11 int w[105][105],dp[1500000],sum[1005],num[1005]; 12 map<string,int> mp; 13 14 int main() 15 { 16 int n,m,i,v,t,k,ans; 17 while(scanf("%d %d",&n,&m)!=EOF&&n&&m) 18 { 19 memset(dp,0,sizeof(dp)); 20 for(i=0;i<n;i++) { 21 scanf("%s",color); 22 mp[color]=i; //用map储存下每一种颜色对应的编号 23 } 24 memset(sum,0,sizeof(sum)); 25 memset(num,0,sizeof(num)); 26 27 for(i=0;i<m;i++){ 28 scanf("%d %s",&t,color); 29 int idx=mp[color]; 30 sum[idx]+=t;//每一种颜色一共需要洗的时间,相当于每一种颜色的总的背包容量 31 w[idx][num[idx]++]=t;//每一种颜色的衣服还对应有不同的洗的时间 32 } 33 ans=0; 34 for(k=0;k<n;k++){ 35 for(i=0;i<=sum[k];++i) dp[i]=0;//这里清零,用i<=sum[k]或者sum[k]/2都可以,但是用memset(dp,0,sizeof(dp))会超时 36 for(i=0;i<num[k];i++) 37 { 38 for(v=sum[k]/2;v>=w[k][i];--v){ 39 dp[v]=max(dp[v],dp[v-w[k][i]]+w[k][i]); 40 } 41 } 42 ans+=sum[k]-dp[sum[k]/2];//将 每一种颜色所需要洗的时间加起来 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 }
看的题解---好久之前看的这一题,当时不理解的是样例,为什么出现了yellow,可是没有给出黄色的衣服所需要洗的时间,后来发现这个没有影响,给出了哪些,就算哪些好了