POJ3211--分类01背包
| Time Limit: 1000MS | Memory Limit: 131072K | |
| Total Submissions: 9700 | Accepted: 3110 |
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 order to prevent the clothes from getting dyed in mixed colors, Dearboy and his girlfriend have to finish washing all clothes of one color before going on to those of another color.
From experience Dearboy knows how long each piece of clothes takes one person to wash. Each piece will be washed by either Dearboy or his girlfriend but not both of them. The couple can wash two pieces simultaneously. What is
the shortest possible time they need to finish the job?
Input
The input contains several test cases. Each test case begins with a line of two positive integers M and N (M < 10, N < 100), which are the numbers of colors and of clothes. The next line containsM strings
which are not longer than 10 characters and do not contain spaces, which the names of the colors. Then follow N lines describing the clothes. Each of these lines contains the time to wash some piece of the clothes (less than 1,000) and its color.
Two zeroes follow the last test case.
Output
For each test case output on a separate line the time the couple needs for washing.
Sample Input
3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0
Sample Output
10
题目大意:
D和他的女朋友两人一块洗衣服,衣服的颜色有很多种,但是每次两人只能洗同一种颜色的衣服。并且洗完这种颜色的衣服才能开始下一种颜色的清洗。问洗完所有衣服的最短时间。
解题思路:
把不同颜色的衣服分别来看。分别求出洗完每种衣服需要的最短时间之后在进行加和就得到了总的最短时间。每种颜色衣服的最短时间就可以看做是不同的01背包,题目给出了洗每件对应的时间,两个人同时进行,极限就是折半。背包的容量就是总时间的一半,得到了一个时间。再用洗完这种颜色衣服的总时间减去这个时间就是最短时间了,因为是“短板效应”,两个人在最快的方案下,最快的时间取决于用时稍长的。最后加和就可以了。代码需要注意的地方就是,下标,因为使用的是结构体里加数组。
源代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<deque>
#include<map>
#include<set>
#include<algorithm>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<cmath>
#include<sstream>
#include<ctime>
using namespace std; struct node
{
string s;
int flag;//标记这种颜色的衣服有多少件
int p[101];//每件衣服要花费的时间
int sum;//洗这种颜色的衣服一共需要花多少时间
}ans[11];
int dp[100*1000]; void init()//初始化
{
int i;
for(i = 0; i < 10; i++)
{
ans[i].s = "";
memset(ans[i].p,0,sizeof(ans[i].p));
ans[i].flag = 0;
ans[i].sum = 0;
}
} int slove(int k)//每一种颜色进行一次01背包
{
int i,j;
memset(dp,0,sizeof(dp));
for(i = 0; i < ans[k].flag; i++)
{
for(j = ans[k].sum/2; j >= ans[k].p[i]; j--)
{
dp[j] = max(dp[j],dp[j-ans[k].p[i]]+ans[k].p[i]);
}
}
return ans[k].sum-dp[ans[k].sum/2];//注意返回值
}
int main()
{
int M,N;
int i,j;
string sa;
int num;
int result;
while(scanf("%d%d",&M,&N)!=EOF&&(M+N))
{
init();//每一次都重新初始化
result = 0;
for(i = 0; i < M; i++)
{
cin>>ans[i].s;
}
for(i = 0; i < N; i++)
{
cin>>num>>sa;
for(j = 0; j < M; j++)
{
if(sa.compare(ans[j].s)==0)
{
ans[j].p[ans[j].flag] = num;
ans[j].sum +=num;
ans[j].flag++;
}
}
}
//分类完成
for(i = 0; i < M; i++)
{
result += slove(i);
}
printf("%d\n",result);
}
return 0;
}
POJ3211--分类01背包的更多相关文章
- POJ3211(trie+01背包)
Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9384 Accepted: 2997 ...
- NYOJ-289 苹果 289 AC(01背包) 分类: NYOJ 2014-01-01 21:30 178人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> #define max(x,y) x>y?x:y struct apple { int c; i ...
- POJ3211 Washing Clothes[DP 分解 01背包可行性]
Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9707 Accepted: 3114 ...
- hdu 2955 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...
- 洛谷P5289 [十二省联考2019]皮配(01背包)
啊啊啊边界判错了搞死我了QAQ 这题是一个想起来很休闲写起来很恶心的背包 对于\(k=0\)的情况,可以发现选阵营和选派系是独立的,对选城市选阵营和学校选派系分别跑一遍01背包就行了 对于\(k> ...
- 2018.09.22 ZJOI2005午餐(贪心+01背包)
描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不 ...
- Codeforces 336C 0-1背包
题意:每个水果有两个值,一个美味度 a,一个卡路里 b,从中挑选一些,要求 sum(aj) / sum(bj) = k,使得 sum(a) 最大. 分析:没有那个条件就是一个01背包,可以转换,对公式 ...
- NYOJ(325)+NYOJ(456),01背包
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=325 http://acm.nyist.net/JudgeOnline/problem. ...
- POJ 3211 Washing Clothes(01背包)
POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...
随机推荐
- 前端-如何用gulp快速搭建项目(sass预编译,代码压缩,css前缀,浏览器自动刷新,雪碧图合成)
一:gulp优点: 易于使用 通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理: 插件高质 Gulp 严格的插件指南确保插件如你期望的那样简洁高质得工作. 构建快速 利用 Node ...
- mybatis 参数为list时,校验list是否为空
校验objStatusList 是否为空 <if test="objStatusList != null and objStatusList.size() > 0 "& ...
- 使用gitbook
前面的话 gitbook功能强大,可以自动实现搜索及翻页等功能,上手容易,用markdown书写即可,且可以自动生成响应式网站.本文将详细介绍如何使用gitbook 安装 1.使用npm全局安装git ...
- [转]Java - 集合框架完全解析
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架.在平常的学习开发中,灵 ...
- MarkDown的快速入门
简介 简单的去解释MarkDown就是html,但是将html中的元素用符号去代替使用.本文用的编译软件是Atom(神器),不多说直接上图看效果. 语法 文本 列表 区块 分割符 表格 链接 mark ...
- grid 布局 CSS3
display:grid 是一种新的布局方式,旧的布局方式通常有副作用,例如float(需要额外修复浮动)或者inline-block(两个元素之间的空格问题) 把父元素定义为grid,就像表格一 ...
- 11) 十分钟学会android--Intent消息处理与传递详解
一个Android app通常都会有多个activities. 每个activity的界面都扮演者用户接口的角色,允许用户执行一些特定任务(例如查看地图或者是开始拍照等).为了让用户能够从一个acti ...
- centos6.7系统安装流程
虚拟机创建centos的过程,如下: 1.首先创建一个空白文件 2.打开虚拟机,打开文件,或者页面的<创建虚拟机>,如下: 3.打开之后如下所示,选择自定义,Linux崇尚自由 4.第四步 ...
- ldap数据库--ldapsearch,ldapmodify
简单介绍一下ldapsearch命令,在ldap搜索条目时很有用,只要适当调整filter就可以. 命令如下: ldapsearch -h hostname -p port -b baseDN -D ...
- 【3】测试搭建成功的单机hadoop环境
1.关闭防火墙service iptables stop,(已经设置开机关闭的忽略) 2.进入hadoop目录,修改hadoop配置文件(4个) core-site.xml(核心配置,fs.defau ...