题目链接:(—_—) 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; }