POJ 3211 Washing Clothes

题目链接:(—_—) zZ


题目大意:有一男一女一起洗衣服, 衣服有不同的颜色和洗每件衣服要花一定的时间, 为了不让衣服染色洗的时候2人只能洗完1种颜色的才能洗下一种,要求求出洗完2人洗完衣服的最短时间。


思路:这题可以根据POJ 1014得出思路,对于每种颜色洗它都有一个总时间,要求洗这种颜色的最少时间,就是求看能不能一个人洗这种颜色的衣服达到总时间的一半。



code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
    int time;
    char str[12];
}Lnode[102];
int s = 0, num[12], dp[102*1002];
int cmp(void const *a, void const *b)
{
    return strcmp((*(struct node *)a).str,(*(struct node *)b).str);
}
int DP(int n, int count)
{
    int i = 0, j = 0, ave = num[count]/2;
    memset(dp, 0, sizeof(dp));
    for(i = s; i<n; i++)
    {
        for(j =ave; j>=Lnode[i].time; j--)
            dp[j] = dp[j]>dp[j-Lnode[i].time]+Lnode[i].time? dp[j]:dp[j-Lnode[i].time]+Lnode[i].time;
    }
    s = n;
    return num[count]-dp[ave];
}
int main()
{
    int i = 0, n = 0, m = 0, sum = 0, count = 0;
    char str[12];
    while(scanf("%d %d", &m, &n), n+m)
    {
        getchar();
        for(i = 0; i<m; i++)
            scanf("%s", str);
        for(i = 0; i<n; i++)
        {
            getchar();
            scanf("%d %s",&Lnode[i].time, Lnode[i].str);
        }
        getchar();
        memset(num, 0, sizeof(num));
        sum = count = s = 0;
        qsort(Lnode, n, sizeof(Lnode[0]), cmp);
        num[0] = Lnode[0].time;
        for(i = 1; i<n; i++)
        {
            if(strcmp(Lnode[i].str, Lnode[i-1].str) == 0)
                num[count] += Lnode[i].time;
            else
            {
                sum += DP(i, count);
                count++;
                num[count] = Lnode[i].time;
            }
        }
        sum += DP(i, count);
        printf("%d\n", sum);
    }
    return 0;
}

原文出处 http://blog.csdn.net/ulquiorra0cifer 如有转载,请需表明

你可能感兴趣的:(POJ 3211 Washing Clothes)