poj 3211 Washing Clothes 洗衣服 0-1背包(★★☆☆☆)

http://poj.org/problem?id=3211

题意:一个男孩和一个女孩一起洗衣服,同一时间两个人可以各洗一件,但不允许两个人共同洗一件衣服。衣服有多种颜色,不能混着洗,否则会被染上其他颜色。他们两个只有把某种颜色的衣服都洗完,才能再去洗其他的。每件衣服,不论谁洗,都会花费一定量的时间。求两个人洗完所有的衣服至少要花费多长时间。

尽管题不是很难,但还是WA了一次,还是做题量不够啊!

重点:把某种颜色的衣服分给两个人洗时,所有的分配方案。

Sample Input

3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0

Sample Output

10

 

  • Source Code
    #pragma warning(disable:4786)
    #include <iostream>
    #include <string>
    #include <map>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int m,n;
    int max(int x, int y){
    	return x>y?x:y;
    }
    int main(){
    	int i,j,k,sum,tmp,ans,dp[100000];
    	string s;
    	vector<int> v[10];
    	map<string,int> mp;
    	while(cin>>m>>n,m){
    		for(i=0;i<m;i++){
    			cin>>s;
    			mp[s]=i;
    		}
    		for(i=0;i<n;i++){
    			cin>>tmp>>s;
    			v[mp[s]].push_back(tmp);
    		}
    		ans=0;
    		for(i=0;i<m;i++){
    			sum=0;
    			memset(dp,0,sizeof dp);
    			for(j=0;j<v[i].size();j++){
    				sum+=v[i][j];
    			}
    			for(j=0;j<v[i].size();j++){
    				for(k=sum;k>=v[i][j];k--){
    					dp[k]=max(dp[k],dp[k-v[i][j]]+v[i][j]);
    				}
    			}
    			if(sum%2==0)
    				tmp=sum/2;
    			else
    				tmp=(sum+1)/2;
    	
    			for(j=tmp;j<=sum;j++){
    				if(dp[j]){
    					ans+=max(dp[j],sum-dp[j]);
    					break;
    				}
    			}
    		}
    		for(i=0;i<10;i++){
    			v[i].clear();
    		}
    		mp.clear();
    		cout<<ans<<endl;
    	}
    	return 0;
    }
  • posted @ 2011-04-28 17:31  Pengchao Bai  阅读(414)  评论(0编辑  收藏  举报