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
#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; }