0-1背包

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 }

 

posted @ 2012-09-17 21:18  superbin  阅读(251)  评论(0编辑  收藏  举报