题目链接:http://poj.org/problem?id=3211
题意:Dearboy夫妇有一桶衣服要清洗,由于衣服颜色不同,质量也不太好,为了防止不同颜色的衣服混合清洗造成染色,所以Dearboy夫妇只能在清洗完一种颜色的衣服后再清洗另一种颜色的衣服(注意理解:如果Dearboy的老婆已经把蓝色衣服洗好了,但Dearboy洗的那一件蓝色衣服还没有清洗好,Dearboy的老婆只能等着,等Dearboy把他洗的蓝色衣服洗好了,才能一起再去洗黄色的衣服)。现有M种颜色的衣服N件,每件衣服的清洗需要的时间和颜色题目告知,问Dearboy夫妇至少需要多少时间能把衣服清洗干净。
思路:由于Dearboy夫妇只能在清洗完一种颜色的衣服后才能清洗另一种颜色的衣服,所以就要求Dearboy夫妇再清洗一种颜色的衣服时花的时间尽可能的相同。假设清洗一种颜色的衣服需要的额总时间为sumtime,将sumtime/2的背包尽可能的装满,清洗该种衣服所需要的时间则为sumtime-dp[sumtime/2](以时间长的一个为准);
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXM 15
#define MAXN 105
int M,N,ans;
char color[MAXM][11];
int dp[50005];
struct Close{
int time;
char col[11];
int used;
}close[MAXN];
int max(int a,int b)
{
return a>b ? a : b ;
}
int main()
{
int i,j;
while(scanf("%d%d",&M,&N) && (M!=0&&N!=0))
{
ans =0;
for(i=0;i<M;i++)
scanf("%s",color[i]);
for(i=0;i<N;i++)
{
scanf("%d %s",&close[i].time,&close[i].col);
close[i].used=0;
}
int temp[105];
for(i=0;i<M;i++)//一种颜色一种颜色的清洗
{
int num=0;
int sumtime=0;
for(j=0;j<N;j++)//求出一种颜色的衣服总共要花费多少时间清洗(sumtime)
{
if(close[j].used)
continue;
if(strcmp(color[i],close[j].col) == 0)
{
temp[num++]=close[j].time;
sumtime += close[j].time;
close[j].used = 1;
}
}
for(int l=0;l<=sumtime/2;l++)
dp[l]=0;
for(int k=0;k<num;k++)//背包sumtime/2最大装满
for(int v=sumtime/2;v>=temp[k];v--)
{
dp[v] = max(dp[v],dp[v-temp[k]]+temp[k]);
}
ans += sumtime - dp[sumtime/2];//清洗一种颜色衣服需要花费的时间
}
printf("%d\n",ans);
}
return 0;
}
分享到:
相关推荐
【标题】"POJ3211--Washing Clothes" 是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这类题目通常要求参赛者编写程序来解决特定问题,以此锻炼和测试他们的编程技能和算法理解能力...
### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1860](https://vjudge.net/problem/POJ-1860)、[poj3259](https://vjudge.net/problem/POJ-3259)、[poj1062](https://vjudge.net/problem/POJ-1062)、[poj2253]...
在ACM/ICPC(国际大学生程序设计竞赛)中,训练和准备是非常关键的,而“poj”(编程在线判题系统)是许多参赛者常用的一个平台进行实战练习。这个压缩包文件提供了针对该平台的题目分类,分为初级、中级和高级三个...
+ 1/(n + 1) card lengths, where the top card overhangs the second by 1/2, the second overhangs tha third by 1/3, the third overhangs the fourth by 1/4, etc., and the bottom card overhangs the table ...
1. 读取输入数据,即平面上的点集。 2. 使用极角排序算法对点集进行排序。 3. 应用深度优先搜索遍历所有可能的连接路径。 4. 在每条路径上计算向量叉积,判断路径是否符合题目要求。 5. 输出满足条件的路径或者点集...
PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中...这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,学长给的,在此分享
《POJ1207-The 3n + 1 problem》是北京大学在线编程平台POJ上的一道经典算法题目,其主要涉及的知识点是数论和动态规划。本题目的核心是解决著名的“Collatz Conjecture”问题,也被称为“3n+1猜想”。 3n+1猜想是...
标题“POJ2676-Sudoku”指向的是北京大学在线编程平台POJ上的一道题目,编号为2676,题目内容与经典的数独游戏有关。解题报告和AC(Accepted)代码是该问题解决方案的组成部分,通常包括对问题的理解、算法设计、...
根据提供的文件信息,本文将对其中提及的几个POJ(Peking University Judge Online)平台上的图论题目进行详细的解析,并介绍解决这些问题时所使用的算法和技术。这些题目涵盖了图论中的多个核心概念,如最短路径、...
在0-1背包问题中,每个物品有一个固定的价值和重量,目标是在不超过背包总容量的情况下,选取价值最大的物品子集。而在多重背包问题中,每种物品可以有多个,这意味着同一个物品可以被选取多次。因此,问题的复杂性...
"西北工业大学POJ试题C++答案代码+课程设计"这一标题表明了资源的主要内容,涉及两个核心部分:一是西北工业大学的编程竞赛(POJ,Problem Oriented Judge System)的C++解题代码,二是与这些题目相关的课程设计。...
网上整理的一些poj刷题指南。 poj地址:http://poj.org
POJ2186-Popular Cows 【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
经典的0-1背包问题. 适合新手学习. 原题网址:http://poj.grids.cn/problem?id=2773
2505 2521 2538 2546 2551 2590 2593 2601 2665 2680 2739 2752 2761 2762 2777 2800 2891 2893 2992 3030 3041 3132 3159 3187 3204 3270 3277 3281 3297 3321 3414 3436 3461 3650 3663 3664 3672 3740
如0/1背包、完全背包等,涉及物品选取以达到最大价值或满足特定条件的问题。 #### 简单动态规划 包括最长公共子序列、最优二分检索树等问题,关键在于状态转移方程的设计。 ### 六、数学 #### 组合数学 涵盖加法...
Washing Clothes涉及到多个阶段的执行,每个阶段可能会有不同的执行时间,并且每个阶段结束后才能进入下一个阶段。根据题目描述,需要考虑先完成哪一颜色衣物的洗涤,以及如何安排以缩短总时间。Charm Bracelet则...
题目"POJ-2870 Light Up"是一个经典的图论问题,主要涉及深度优先搜索(DFS)算法的运用。该问题要求点亮一个矩形区域内的所有障碍物,每个障碍物需要特定数量的灯光才能被照亮,且相邻的障碍物之间不能有空格。题目...
* 背包问题:例如 poj1837、poj1276。 * 类型 DP:例如 poj3267、poj1836、poj1260、poj2533。 中级 1. 基本算法: * C++的标准模版库的应用:例如 poj3096、poj3007。 * 较为复杂的模拟题的训练:例如 poj...