POJ 3211 Washing Clothes
题目大意:有一男一女一起洗衣服, 衣服有不同的颜色和洗每件衣服要花一定的时间, 为了不让衣服染色洗的时候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 www.zzzyk.com
{
sum += DP(i, count);
count++;
num[count] = Lnode[i].time;
}
}
sum += DP(i, count);
printf("%d\n", sum);
}
return 0;
}
作者:ulquiorra0cifer
补充:软件开发 , C++ ,