您的位置:首页 > 其它

POJ_3211 Washing Clothes (01背包)

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

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

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

My Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

const int M = 11;
const int N = 110;

int sum[M];
int num[M];
int w[M]
;
int f[1000*101];
string s[M];
string st;

int main() {
//freopen("data.in", "r", stdin);

int n, m, V, i, j, k, ans;
while(~scanf("%d%d", &m, &n)) {
if(!m && !n)    break;
for(i = 0; i < M; i++)     s[i].clear();
memset(num, 0, sizeof(num));
memset(sum, 0, sizeof(num));

for(i = 0; i < m; i++) {
cin >> s[i];
}
for(j = 0; j < n; j++) {
cin >> V >> st;
for(i = 0; i < m; i++) {
if(st == s[i])    {w[i][num[i]++] = V; sum[i] += V; st.clear();}
}
}
ans = 0;
for(i = 0; i < m; i++) {
if(sum[i] == 0)    continue;
memset(f, 0, sizeof(f));
V = sum[i]/2;
for(j = 0; j < num[i]; j++) {
for(k = V; k >= w[i][j]; k--) {
f[k] = max(f[k], f[k-w[i][j]] + w[i][j]);
}
}
ans += (sum[i] - f[V]);
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: