[POJ 3211] Washing Clothes (动态规划)

题目链接:http://poj.org/problem?id=3211

题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色。现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的衣服。

问:在两个人可以同时洗衣服的情况下,把衣服全部洗完最少需要多久。

如果说两个人同时洗同一种颜色衣服,那么最少的时间就是洗完该颜色衣服的总时间的一半。

那么我们可以将洗每种衣服分开来看,视作一个01背包,容量是洗该颜色衣服的总时间的一半。

然后最多花多久。那么该颜色的总时间-这个人花的最多时间就是另一个洗这种颜色衣服的时间。

最后求最大的。

代码:

 1 import java.util.*;
 2
 3 public class Main{
 4     static HashMap<String,Integer> hs;
 5     public static void main(String[] args){
 6         Scanner cin = new Scanner(System.in);
 7         while( true ){
 8             int N = cin.nextInt();
 9             int M = cin.nextInt();
10
11             if( N==0&&M==0 ) break;
12
13             int c[][] = new int[N+1][M+1];
14
15             hs = new HashMap<String,Integer>();
16
17             for(int i=1;i<=N;i++){
18                 String s = cin.next();
19                 hs.put(s, i);
20             }
21
22             int sum[] = new int[N+1];
23
24             int sumn = 0;
25
26             for(int i=1;i<=M;i++){
27                 int ta = cin.nextInt();
28                 String tb = cin.next();
29                 int x = hs.get(tb);
30                 c[x][++c[x][0]] = ta;
31                 sum[x] += ta;
32                 sumn += ta;
33             }
34
35             int dp[][] = new int[N+1][sumn+100];
36             int ans = 0;
37             for(int i=1;i<=N;i++){
38                 for(int k=1;k<=c[i][0];k++){
39                     for(int j=sum[i]/2;j>=c[i][k];j--){
40                         if( j>=c[i][k] )
41                             dp[i][j] = Math.max(dp[i][j],dp[i][j-c[i][k]]+c[i][k]);
42                     }
43                 }
44                 ans += dp[i][sum[i]/2];
45             }
46
47             System.out.println(Math.max(ans,sumn-ans));
48
49         }
50     }
51 }
时间: 2024-10-11 02:16:47

[POJ 3211] Washing Clothes (动态规划)的相关文章

POJ 3211 Washing Clothes 背包题解

本题是背包问题,但是需要转化成背包的. 因为是两个人洗衣服,那么就是说一个人只需要洗一半就可以了,因为不能两个人同时洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服需要的总时间totTime 2 利用动态规划背包法求这些衣服能在那些时间点完成 3 求比(totTime+1)/2大的最小时间点 4 得到洗一种颜色衣服的时间,那么继续求下洗一种颜色衣服的时间 5 最后加起来就是答案了. 这个是算法问题. 剩下来就是考编程功力了,因为给出的数据,需要我们自己把衣服分类,分类之

POJ 3211 Washing Clothes

Description Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a beautiful and hard-working girlfriend to help him. The clothes are in varieties of colors but each piece of them can be seen as of only one color. In

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[

POJ 3211 Washing Clothes(01背包)

http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件,Dearboy和她的girlfriend两个人要一起洗完全部衣服,为了预防色彩混合,他们每次只能同时洗同一种颜色的衣服,给出洗完每件衣服所需的时间time和它的颜色color,求出Dearboy和她的girlfriend最少用多少时间能洗完成全部衣服. 分析: 由于每种颜色的衣服是分开洗的, 所以我们可以把所有衣服按颜色分类, 然后每次看洗一种颜色的衣服最少需要花多少

POJ 3211 Washing Clothes【01背包】

题意:给出n种颜色,m件衣服,再分别给出m件衣服的颜色,和洗所需要的时间,dearboy和他的妹子一起洗衣服,且同种颜色的衣服不能同时洗,也不能两个人同时洗一件衣服,问洗完这m件衣服至少需要的时间 先考虑怎样才能让时间最少的方案,肯定是dearboy和他的妹纸各洗一半的时间,这样消耗的时间最少, 这样可以联想到杭电那一道big event in HDU,平均划分背包容量来做. 1 #include<iostream> 2 #include<cstdio> 3 #include<

POJ3211 Washing Clothes[DP]

Washing Clothes Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9707   Accepted: 3114 Description Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a beautiful and hard-working girlfriend to help him

POJ 3071 Football (动态规划-概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2768   Accepted: 1412 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

[ACM] POJ 2593 Max Sequence (动态规划,最大字段和)

Max Sequence Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15569   Accepted: 6538 Description Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N). You should output S. Input The input will consist of several test cases. Fo