程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 3211 Washing Clothes 0-1背包

poj 3211 Washing Clothes 0-1背包

編輯:C++入門知識

poj 3211 Washing Clothes 0-1背包


題意:

有2個人洗n件衣服,每件衣服有需要洗的時間和顏色,只能相同顏色的衣服兩人一起洗,求洗完衣服的最少時間。

分析:

0-1背包判斷某個重量是否能達到。

代碼:

//poj 3211
//sep9
#include 
#include 
#include 
using namespace std;
const int maxN=128;
int m,n;
map 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>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;
} 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved