1、 POJ 3211 Washing Clothes
分析:洗某种颜色的衣服的顺序是任意的,问题可以转化为,洗某种颜色衣服的最少用时;有两个人可以同时洗,则要使两个人的用时的差最小,即将总用时的1/2作为背包容量,求最接近1/2容量的那个值。
只有重量,没有权值的0-1背包:
memset(f, -1, sizeof(f)); //初始化
f[0] = 0;
for (j=0; j<ct[i]; j++) {
for (int k=vol-time[i][j]; k>=0; k--) {
if (f[k] >= 0) {
f[k+time[i][j]] = 1;
}
}
}
View Code
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int n, m; 7 char clor[15][15]; 8 int time[15][100], ct[15], sum[15]; 9 int f[100010]; 10 while (scanf("%d%d", &n, &m) && (n||m)) { 11 int i, j; 12 13 for (i=0; i<n; i++) 14 scanf("%s", clor[i]); 15 memset(ct, 0, sizeof(ct)); 16 memset(sum, 0, sizeof(sum)); 17 for (i=0; i<m; i++) { 18 int t; 19 char cl[15]; 20 21 scanf("%d%s", &t, cl); 22 for (j=0; j<n; j++) { 23 if (strcmp(cl, clor[j]) == 0) { 24 time[j][ct[j]++] = t; 25 sum[j] += t; 26 break; 27 } 28 } 29 } 30 31 int st = 0; 32 for (i=0; i<n; i++) { 33 int vol = sum[i] / 2; 34 memset(f, -1, sizeof(f)); 35 f[0] = 0; 36 for (j=0; j<ct[i]; j++) { 37 for (int k=vol-time[i][j]; k>=0; k--) { 38 if (f[k] >= 0) { 39 f[k+time[i][j]] = 1; 40 } 41 } 42 } 43 int v1 = vol; 44 while (f[v1] < 0) v1--; 45 st += sum[i] - v1; 46 47 } 48 printf("%d\n", st); 49 } 50 return 0; 51 }