Washing Clothes
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背包的更多相关文章

  1. POJ3211(trie+01背包)

    Washing Clothes Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9384   Accepted: 2997 ...

  2. 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 ...

  3. POJ3211 Washing Clothes[DP 分解 01背包可行性]

    Washing Clothes Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9707   Accepted: 3114 ...

  4. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

  5. 洛谷P5289 [十二省联考2019]皮配(01背包)

    啊啊啊边界判错了搞死我了QAQ 这题是一个想起来很休闲写起来很恶心的背包 对于\(k=0\)的情况,可以发现选阵营和选派系是独立的,对选城市选阵营和学校选派系分别跑一遍01背包就行了 对于\(k> ...

  6. 2018.09.22 ZJOI2005午餐(贪心+01背包)

    描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不 ...

  7. Codeforces 336C 0-1背包

    题意:每个水果有两个值,一个美味度 a,一个卡路里 b,从中挑选一些,要求 sum(aj) / sum(bj) = k,使得 sum(a) 最大. 分析:没有那个条件就是一个01背包,可以转换,对公式 ...

  8. NYOJ(325)+NYOJ(456),01背包

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=325 http://acm.nyist.net/JudgeOnline/problem. ...

  9. POJ 3211 Washing Clothes(01背包)

    POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...

随机推荐

  1. 1_ROS学习

    1_搭建树莓派环境 树莓派是一个嵌入式计算机,专门用来做嵌入式开发的.我们组上用的树莓派是raspberry pi 3 mode B,5V供电,最大电流不超过2A: 我们需要在树莓派上安装上操作系统. ...

  2. Problem A

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  3. 脑残手贱:被NFS祸害的调度系统

    建议:任何时候,都要三思而后行!!! 事请的缘由 系统中采用slurm调度系统来进行并行计算.但是在GPU节点上,无论如何都无法启动slurmd,报插件初始化错误的故障. 因此需要编译新的munge和 ...

  4. vue小项目---管理系统

    在上一篇文章中我们已经学习了vue的基本语法,常用属性,了解了vue的基本使用,现在让我们用vue配合Bootstrap来完成一个小项目. 首先导入Bootstap文件. <link rel=& ...

  5. robotframework2.8.7日志输出List乱码

    今天在完善robotframework的数据分离的时候,需要读取list中的中文信息,在日志输出中,英文显示是正常的:但是中文就出现所谓的乱码情况,如截图所示 对于list中的信息,日志显示乱码:查找 ...

  6. 初窥图像识别与k-means算法

    前段时间做了一个车型识别的小项目,思路是利用k-means算法以及词袋模型来做的. 近年来图像识别的方法非常非常多,这边只记录一下我那个项目的思路,核心思想是k-means算法和词汇树. 很遗憾没有做 ...

  7. JQuery源码-------JQuery中数值型变量的判断isNumeric

    判断一个数值型变量的方法,在jquery中非常简单,只有一行代码. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false ...

  8. Minix3信号处理分析

    进程的信号处理的相关结构 PM中存放着所有进程的进程描述符,在一个进程描述符中,有一个指针,指向一个sigaction结构二维数组中的一项,表示这个进程所有信号的操作.一个sigaction结构包含信 ...

  9. 高阶函数实现AOP

    AOP(面向切面程序)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日至统计.安全控制.异常处理等.把这些功能抽离出来之后,再通过"动态织入&quo ...

  10. 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库

    开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...