poj 3211 Washing Clothes

// 题意 :夫妻两洗衣服,衣服有m种颜色,每种颜色又有若干件,每件衣服洗完需要特定的时间,要求每种颜色放在一起洗,洗完才能洗其他衣服。最后问洗完需要的最少时间
// 将衣服按颜色分类 然后求出每种颜色衣服需要的最少时间,然后累加
// 求每种颜色衣服的最少时间就是把洗衣服的时间尽量分成靠近的两部分 就用总时间的一半作为背包的容量 ,然后求该容量的最大值 每件的空间消耗和价值看成是一样的
// 然后就是 0-1背包了
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 100010 char str[20][20]; int dp[maxn]; char ch[20]; int num[20]; int sum[20]; int t; int M,N; int ar[20][100]; int fun(){ for(int i=1;i<=M;i++) if(strcmp(ch,str[i])==0) return i; return 0; } int main() { while(scanf("%d %d",&M,&N),M|N){ int i,j,k; for(i=1;i<=M;i++) scanf("%s",str[i]),num[i]=sum[i]=0;//,printf("%s",str[i]); for(i=1;i<=N;i++){ scanf("%d %s",&t,ch);//,printf("%s",ch); k=fun(); sum[k]+=t; ar[k][num[k]++]=t; } int L,ans=0; for(i=1;i<=M;i++){ L=sum[i]/2; for(j=0;j<=L;j++) dp[j]=0; for(j=0;j<num[i];j++) for(k=L;k>=ar[i][j];k--) dp[k]=max(dp[k],dp[k-ar[i][j]]+ar[i][j]); ans+=max(sum[i]-dp[L],dp[L]); } printf("%d ",ans); } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3190516.html