zoukankan      html  css  js  c++  java
  • 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 }



  • 相关阅读:
    第二冲刺阶段第一天
    spring第二冲刺阶段第八天
    spring第二冲刺阶段第七天
    spring第二冲刺阶段第六天
    spring第二冲刺阶段第五天
    spring冲刺第二阶段第四天
    spring第二阶段冲刺第三天
    spring冲刺第二阶段第二天
    SPRING冲刺第二阶段第一天
    spring第一冲刺阶段总结200zi
  • 原文地址:https://www.cnblogs.com/vongang/p/2293778.html
Copyright © 2011-2022 走看看