POJ 3211 Washing Clothes 背包题解

本题是背包问题,但是需要转化成背包的。

因为是两个人洗衣服,那么就是说一个人只需要洗一半就可以了,因为不能两个人同时洗一件衣服,所以就成了01背包问题了。

思路:

1 计算洗完同一颜色的衣服需要的总时间totTime

2 利用动态规划背包法求这些衣服能在那些时间点完成

3 求比(totTime+1)/2大的最小时间点

4 得到洗一种颜色衣服的时间,那么继续求下洗一种颜色衣服的时间

5 最后加起来就是答案了。

这个是算法问题。

剩下来就是考编程功力了,因为给出的数据,需要我们自己把衣服分类,分类之后再对每一种颜色衣服进行动态规划法。

会使用map就不难了。

我这里是使用map,然后把颜色转化为整数,然后利用vector容器保存分类结果的。

用好vector也不用担心数组不够大的问题,不过vector却是比一般数组慢一点点的。

#include <stdio.h>
#include <map>
#include <string>
#include <vector>
using std::map;
using std::string;
using std::vector;

int bagDP(vector<vector<int> > &cl)
{
	int washTime = 0;
	for (int i = 0; i < (int)cl.size(); i++)
	{
		int totTime = 0;
		for (int j = 0; j < (int)cl[i].size(); j++)
			totTime += cl[i][j];

		vector<bool> tbl(totTime+1);
		tbl[0] = true;
		for (int j = 0; j < (int)cl[i].size(); j++)
		{
			for (int t = totTime; t >= cl[i][j]; t--)
				if (tbl[t-cl[i][j]]) tbl[t] = true;
		}
		int t = (totTime+1)>>1;
		for ( ; t <= totTime && !tbl[t]; t++);
		washTime += t;
	}
	return washTime;
}

int main()
{
	int colorM, clothN, time;
	char col[12];
	while (scanf("%d %d", &colorM, &clothN) && colorM)
	{
		map<string, int> siMp;//for classifying
		string s;
		int c = 0;
		for (int i = 0; i < colorM; i++)
		{
			scanf("%s", col);
			s = col;
			siMp[s] = c++;
		}
		vector<vector<int> > clothes(siMp.size());
		for (int i = 0; i < clothN; i++)
		{
			scanf("%d %s", &time, col);
			s = col;
			clothes[siMp[s]].push_back(time);
		}
		siMp.clear();
		printf("%d\n", bagDP(clothes));
	}
	return 0;
}

POJ 3211 Washing Clothes 背包题解,布布扣,bubuko.com

时间: 2024-10-10 06:55:48

POJ 3211 Washing Clothes 背包题解的相关文章

POJ 3211 Washing Clothes

Description Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a beautiful and hard-working girlfriend to help him. The clothes are in varieties of colors but each piece of them can be seen as of only one color. In

poj 3211 Washing Clothes 0-1背包

题意: 有2个人洗n件衣服,每件衣服有需要洗的时间和颜色,只能相同颜色的衣服两人一起洗,求洗完衣服的最少时间. 分析: 0-1背包判断某个重量是否能达到. 代码: //poj 3211 //sep9 #include <iostream> #include <map> #include <string> using namespace std; const int maxN=128; int m,n; map<string,int> name; int v[

POJ 3211 Washing Clothes(01背包)

http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件,Dearboy和她的girlfriend两个人要一起洗完全部衣服,为了预防色彩混合,他们每次只能同时洗同一种颜色的衣服,给出洗完每件衣服所需的时间time和它的颜色color,求出Dearboy和她的girlfriend最少用多少时间能洗完成全部衣服. 分析: 由于每种颜色的衣服是分开洗的, 所以我们可以把所有衣服按颜色分类, 然后每次看洗一种颜色的衣服最少需要花多少

POJ 3211 Washing Clothes【01背包】

题意:给出n种颜色,m件衣服,再分别给出m件衣服的颜色,和洗所需要的时间,dearboy和他的妹子一起洗衣服,且同种颜色的衣服不能同时洗,也不能两个人同时洗一件衣服,问洗完这m件衣服至少需要的时间 先考虑怎样才能让时间最少的方案,肯定是dearboy和他的妹纸各洗一半的时间,这样消耗的时间最少, 这样可以联想到杭电那一道big event in HDU,平均划分背包容量来做. 1 #include<iostream> 2 #include<cstdio> 3 #include<

[POJ 3211] Washing Clothes (动态规划)

题目链接:http://poj.org/problem?id=3211 题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色.现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的衣服. 问:在两个人可以同时洗衣服的情况下,把衣服全部洗完最少需要多久. 如果说两个人同时洗同一种颜色衣服,那么最少的时间就是洗完该颜色衣服的总时间的一半. 那么我们可以将洗每种衣服分开来看,视作一个01背包,容量是洗该颜色衣服的总时间的一半. 然后最多花多久.那么该颜色的总时间-这个人花的最多时间

POJ 2392 Space Elevator 背包题解

多重背包,本题不需要二分优化.相对简单点.因为重复数十分小,小于10: 而增加一个限制每种材料的高度做法,如果使用逆向填表,那么只需要从这个高度往小递归填表就可以了. 还有就是注意要排序,以限制高度为标准从小到大排序,否则答案错误的. #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; const int MAX_K = 401; const int MAX_H = 4

POJ 3624 Charm Bracelet 背包题解

最简单的背包问题了,本题应该除了背包就一个考点了:不能开二维数组.我没开过二维,不过看数据是不可以的.太大了. 做法有两种改进省内存DP: 1 所谓的滚动数组 2 逆向填表 很久没做背包DP,突然觉得这种背包问题很简单了. 下面给出两种解法: 1 calBag()是滚动数组 2 calBag2()是逆向填表 #pragma once #include <stdio.h> #include <stdlib.h> #include <vector> using namesp

POJ 1276 Cash Machine 背包题解

典型的多重背包的应用题解. 可以使用二进制优化,也可以使用记录当前物品的方法解,速度更加快. const int MAX_CASH = 100001; const int MAX_N = 11; int tbl[MAX_CASH], nums[MAX_N], bills[MAX_N], cash, n; int bag() { if (cash <= 0 || n <= 0) return 0; memset(tbl, 0, sizeof(int) * (cash+1)); for (int

POJ 3211 (分组01背包) Washing Clothes

题意: 小明有一个贤妻良母型的女朋友,他们两个一起洗衣服. 有M种颜色的N件衣服,要求洗完一种颜色的衣服才能洗另外一种颜色. 两人可以同时洗,一件衣服只能被一个人洗. 给出洗每件衣服所用的时间,求两个人洗完这些衣服所用的最短时间. 分析: 因为每种颜色是分开洗的,所以我们可以单独考虑一种颜色的衣服. 因为洗完这些衣服的总时间是固定的,所以两个人洗的时间尽可能的相等,这样洗完的时间最短. 所以将总时间的一半作为背包容量(这里总时间的奇偶性并不影响),物品的体积和价值都是洗每件衣服所用的时间,然后进