POJ 3211 Washing Clothes【01背包】

 

题意:给出n种颜色,m件衣服,再分别给出m件衣服的颜色,和洗所需要的时间,dearboy和他的妹子一起洗衣服,且同种颜色的衣服不能同时洗,也不能两个人同时洗一件衣服,问洗完这m件衣服至少需要的时间

 

先考虑怎样才能让时间最少的方案,肯定是dearboy和他的妹纸各洗一半的时间,这样消耗的时间最少,

这样可以联想到杭电那一道big event in HDU,平均划分背包容量来做。

 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 }
View Code

 

 

 

 

看的题解---好久之前看的这一题,当时不理解的是样例,为什么出现了yellow,可是没有给出黄色的衣服所需要洗的时间,后来发现这个没有影响,给出了哪些,就算哪些好了

posted @ 2015-03-03 10:00  sequenceaa  阅读(162)  评论(0编辑  收藏  举报