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,可是没有给出黄色的衣服所需要洗的时间,后来发现这个没有影响,给出了哪些,就算哪些好了

你可能感兴趣的:(poj)