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:
思路:把每种颜色的衣服归类,求出第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; }
相关文章推荐
- 背包 POJ 3211 Washing Clothes【01背包】
- poj 3211 Washing Clothes 01背包
- poj 3211 Washing Clothes(01背包)
- POJ 3211 Washing Clothes(01背包)@
- POJ 3211 Washing Clothes(01背包)
- POJ 3211 washing clothes (01背包)
- POJ 3211 Washing Clothes (平衡划分&01背包)
- poj 3211 Washing Clothes(分组01背包)
- POJ 3211 Washing Clothes(01背包/可行性判断)
- POJ-3211 Washing Clothes[01背包问题]
- Washing Clothes - POJ 3211 01背包
- poj 3211 Washing Clothes(01背包问题)
- poj 3211 Washing Clothes(01背包)
- POJ 3211 Washing Clothes【01背包】
- poj 3211 Washing Clothes 01背包问题
- POJ 3211 Washing Clothes【01背包】
- POJ 3211 - Washing Clothes(01背包)
- POJ 3211 Washing Clothes(01背包)
- poj 3211 Washing Clothes 01背包
- POJ 3211 (分组01背包) Washing Clothes