题目链接:http://poj.org/problem?id=3211
题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色。现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的衣服。
问:在两个人可以同时洗衣服的情况下,把衣服全部洗完最少需要多久。
如果说两个人同时洗同一种颜色衣服,那么最少的时间就是洗完该颜色衣服的总时间的一半。
那么我们可以将洗每种衣服分开来看,视作一个01背包,容量是洗该颜色衣服的总时间的一半。
然后最多花多久。那么该颜色的总时间-这个人花的最多时间就是另一个洗这种颜色衣服的时间。
最后求最大的。
代码:
import java.util.*; public class Main{
static HashMap<String,Integer> hs;
public static void main(String[] args){
Scanner cin = new Scanner(System.in);
while( true ){
int N = cin.nextInt();
int M = cin.nextInt(); if( N==0&&M==0 ) break; int c[][] = new int[N+1][M+1]; hs = new HashMap<String,Integer>(); for(int i=1;i<=N;i++){
String s = cin.next();
hs.put(s, i);
} int sum[] = new int[N+1]; int sumn = 0; for(int i=1;i<=M;i++){
int ta = cin.nextInt();
String tb = cin.next();
int x = hs.get(tb);
c[x][++c[x][0]] = ta;
sum[x] += ta;
sumn += ta;
} int dp[][] = new int[N+1][sumn+100];
int ans = 0;
for(int i=1;i<=N;i++){
for(int k=1;k<=c[i][0];k++){
for(int j=sum[i]/2;j>=c[i][k];j--){
if( j>=c[i][k] )
dp[i][j] = Math.max(dp[i][j],dp[i][j-c[i][k]]+c[i][k]);
}
}
ans += dp[i][sum[i]/2];
} System.out.println(Math.max(ans,sumn-ans)); }
}
}