首页 > 代码库 > poj 3211 Washing Clothes 0-1背包

poj 3211 Washing Clothes 0-1背包

题意:

有2个人洗n件衣服,每件衣服有需要洗的时间和颜色,只能相同颜色的衣服两人一起洗,求洗完衣服的最少时间。

分析:

0-1背包判断某个重量是否能达到。

代码:

//poj 3211
//sep9
#include <iostream>
#include <map>
#include <string>
using namespace std;
const int maxN=128;
int m,n;
map<string,int> name; 
int v[maxN][maxN];
int dp[100028];

int pack(int k)
{
	memset(dp,0,sizeof(dp));
	dp[0]=1;
	int i,j,tot=0;
	for(i=1;i<=v[k][0];++i)
		tot+=v[k][i];
	int ans=tot;
	for(i=1;i<=v[k][0];++i){
		int w=v[k][i];
		for(j=tot;j>=w;--j){
			dp[j]=max(dp[j],dp[j-w]);
			if(dp[j]==1)
				ans=min(ans,max(j,tot-j));
		}
	}
	return ans;					
}

int main()
{
	while(scanf("%d%d",&m,&n)==2){
		if(m==0&&n==0)
			break;
		while(m--)
			scanf("%*s");
		int num=0;
		name.clear();
		for(int i=0;i<n;++i){
			int x;
			string a;
			cin>>x>>a;	
			if(name[a]==0){
				name[a]=++num;
				v[name[a]][0]=0;
			}
			v[name[a]][++v[name[a]][0]]=x;	
		}
		int ans=0;		
		for(int i=1;i<=num;++i)
			ans+=pack(i);
		printf("%d\n",ans);
	}	
	return 0;
} 


poj 3211 Washing Clothes 0-1背包