POJ_3211 Washing Clothes (01背包)

  题意是夫妻俩洗衣服,只有一个盆。为了防止不同颜色的衣服混色,他俩一个用一个盆同时洗衣服,但只能是相同颜色的衣服。现在知道颜色数M, 衣服数N, 每件衣服的洗完所用的时间和每件衣服的颜色。求最短多长时间把所有的衣服洗完。

  思路:把每种颜色的衣服归类,求出第i种颜色衣服所用的总时间sum[i], 以sum[i]/2为背包容量,求出该容量是背包的最大value,sum[i] - f[sum[i]/2]就是洗这种颜色的衣服所用的时间。

  ps:wa了两次,不知道为什么,又重新敲了一遍就过了。

My Code:

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <string>
5
6 using namespace std;
7
8 const int M = 11;
9 const int N = 110;
10
11 int sum[M];
12 int num[M];
13 int w[M][N];
14 int f[1000*101];
15 string s[M];
16 string st;
17
18 int main() {
19 //freopen("data.in", "r", stdin);
20
21 int n, m, V, i, j, k, ans;
22 while(~scanf("%d%d", &m, &n)) {
23 if(!m && !n) break;
24 for(i = 0; i < M; i++) s[i].clear();
25 memset(num, 0, sizeof(num));
26 memset(sum, 0, sizeof(num));
27
28 for(i = 0; i < m; i++) {
29 cin >> s[i];
30 }
31 for(j = 0; j < n; j++) {
32 cin >> V >> st;
33 for(i = 0; i < m; i++) {
34 if(st == s[i]) {w[i][num[i]++] = V; sum[i] += V; st.clear();}
35 }
36 }
37 ans = 0;
38 for(i = 0; i < m; i++) {
39 if(sum[i] == 0) continue;
40 memset(f, 0, sizeof(f));
41 V = sum[i]/2;
42 for(j = 0; j < num[i]; j++) {
43 for(k = V; k >= w[i][j]; k--) {
44 f[k] = max(f[k], f[k-w[i][j]] + w[i][j]);
45 }
46 }
47 ans += (sum[i] - f[V]);
48 }
49 printf("%d\n", ans);
50 }
51 return 0;
52 }



原文地址:https://www.cnblogs.com/vongang/p/2293778.html