PKU--3211 Washing Clothes(01背包)
2024-09-06 10:32:57
题目http://poj.org/problem?id=3211
分析:两个人洗衣服,可以同时洗,但是只能同时洗一种颜色。
要时间最短,那么每一种颜色的清洗时间最短。
转换为,两个人洗同一种颜色的衣服,彼此之间的时间差最小。
这里也就是前面做过的01背包问题了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N,M;
int num[20],sum[20],dp[100010],w[20][20];
char color[20][20];
int Index(char *str)
{
for(int i=1;i<=M;i++)
if(!strcmp(str,color[i])) return i;
}
int ZeroOnePack()
{
int sumtime=0;
//第一层循环遍历所有的颜色
for(int i=1;i<=M;i++)
{
memset(dp,0,sizeof(dp));
//01背包问题
for(int j=1;j<=num[i];j++)
for(int k=sum[i]/2;k>=w[i][j];k--)
dp[k]=max(dp[k],dp[k-w[i][j]]+w[i][j]);
//计算时间总和
sumtime+=sum[i]-dp[sum[i]/2];
}
return sumtime;
}
int main()
{
char str[20];
int time;
while (scanf("%d%d",&M,&N))
{
if(N==0&&M==0) break;
for(int i=1;i<=M;i++)
scanf("%s",color[i]);
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
for(int i=1;i<=N;i++)
{
scanf("%d %s",&time,str);
//对数据进行预处理,按照颜色分类
int index=Index(str);
num[index]++;
sum[index]+=time;
w[index][num[index]]=time;
}
printf("%d\n",ZeroOnePack());
}
return 0;
}
最新文章
- 平衡二叉树AVL插入
- JS:采摘自JS精粹
- 编写shell管理脚本(一)
- Ajax解析
- windows 删除多层文件夹
- Oracle 11g透明网关连接Sqlserver 2000
- Java NIO 与 IO
- jQuery插件之validation插件
- 数据库表反向生成(二) Django ORM inspectdb
- HBase Block Cache(块缓存)
- HASHSET不能预留容量问题
- NumPy-快速处理数据--ndarray对象--数组的创建和存取
- Promise的实现原理
- 【linux基础】使用命令行编译运行c++程序
- ssh安装
- UI5-文档-2-开发环境
- c++ 预处理和多重替换
- 【BZOJ4903/UOJ300】【CTSC2017】吉夫特
- spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference &#39;*&#39; is ambiguous)
- (1)C#工具箱-公共控件1