poj3211

Washing Clothes
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 9654   Accepted: 3095

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 order to prevent the clothes from getting dyed in mixed colors, Dearboy and his girlfriend have to finish washing all clothes of one color before going on to those of another color.

From experience Dearboy knows how long each piece of clothes takes one person to wash. Each piece will be washed by either Dearboy or his girlfriend but not both of them. The couple can wash two pieces simultaneously. What is the shortest possible time they need to finish the job?

Input

The input contains several test cases. Each test case begins with a line of two positive integers M and N (M < 10, N < 100), which are the numbers of colors and of clothes. The next line contains M strings which are not longer than 10 characters and do not contain spaces, which the names of the colors. Then follow N lines describing the clothes. Each of these lines contains the time to wash some piece of the clothes (less than 1,000) and its color. Two zeroes follow the last test case.

Output

For each test case output on a separate line the time the couple needs for washing.

Sample Input

3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0

Sample Output

10

Source

 
中文翻译:
 
洗衣服
时间限制:1000毫秒   内存限制:131072 k
总提交:9654年   接受:3095年

描述

Dearboy最近太忙了,现在他有一大堆衣服要洗。幸运的是,他有一个漂亮的和勤奋的女朋友去帮助他。品种的衣服颜色但每一块可以被看作是只有一种颜色。为了防止衣服染色在混合颜色,Dearboy和他的女友不得不洗完所有的衣服一个颜色之前的另一种颜色。

从经验Dearboy知道每件衣服需要多久一个人洗。每一块将被清洗Dearboy或女友但不是他们两人。这对夫妇可以同时洗两块。什么是他们所需要的最短的时间内完成这项工作吗?

输入

输入包含多个测试用例。每个测试用例开始于一条线的两个正整数M和N(M < 10 N < 100),衣服的颜色和数量。下一行包含字符串不超过10个字符,不含空格,这颜色的名称。然后描述衣服的N行。文件中的每一行包含的时间洗一些衣服(小于1000)和它的颜色。两个0跟随最后一个测试用例。

输出

为每个测试用例输出一个单独的行上这对夫妇需要清洗的时间。

样例输入

3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0

样例输出

10

 
题解:
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
    int t;
    char c[10];
}col[101];
char color[10][10];
int n,m,ans,sum[10],f[1000100];
int main(){
    while(scanf("%d%d",&m,&n)==2){
        if(!n||!m) break;
        memset(sum,0,sizeof sum);
        for(int i=1;i<=m;i++) scanf("%s",color[i]);
        for(int i=1;i<=n;i++){
            scanf("%d%s",&col[i].t,col[i].c);
            for(int j=1;j<=m;j++){
                if(!strcmp(col[i].c,color[j])){
                    sum[j]+=col[i].t;break;//统计同一种颜色衣服的件数
                }
            }
        }
        ans=0;
        for(int i=1;i<=m;i++){//求标记为i的颜色的时间
            for(int j=1;j<=sum[i]>>1;j++) f[j]=0;
            for(int j=1;j<=n;j++){
                if(!strcmp(col[j].c,color[i])){
                    for(int v=sum[i]>>1;v>=col[j].t;v--){
                        f[v]=max(f[v],f[v-col[j].t]+col[j].t);
                    }
                }
                
            }
            ans+=sum[i]-f[sum[i]>>1];
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5728215.html