poj3211 Washing Clothes(01背包)
2016-01-30 13:51
239 查看
poj3211
分析
按推荐的人来说是分组背包,但实际上是01背包,分组只是形式了一下。大致就是两个人洗衣服,两个人先把相同颜色的一组衣服洗完,再洗下一组,问最短时间,且每一件衣服只能被一个人洗。那么要处理的问题就是求出一组衣服两个人洗时的最少时间,处理方法就是对一组衣服,以总时间的一半作为背包最大容量,求出最大价值,然后用总的减去,那么另一个人的时间就是大于或等于最大价值,也是题目要求的最短时间,注意每一次都要初始化,因为每组之间没有联系。。。题目
http://poj.org/problem?id=3211代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char color[15][15]; int num[15]; int sum[15]; int data[15][110]; int dp[100000]; int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF&&(n!=0&&m!=0)) { int total=0; memset(num,0,sizeof(num)); memset(sum,0,sizeof(sum)); for(int i=1; i<=n; i++) scanf("%s",color[i]); for(int i=0; i<m; i++) { char temp[15]; int time; scanf("%d %s",&time,temp); for(int j=1; j<=n; j++) { if(strcmp(temp,color[j])==0) { num[j]++; sum[j]+=time; data[j][num[j]]=time; break; } } } for(int i=1; i<=n; i++) { memset(dp,0,sizeof(dp)); for(int j=1; j<=num[i]; j++) { for(int k=sum[i]/2; k>=data[i][j]; k--) { dp[k]=max(dp[k],dp[k-data[i][j]]+data[i][j]); } } total+=sum[i]-dp[sum[i]/2]; } printf("%d\n",total); } return 0; }
相关文章推荐
- 【Android】【笔记】《The Android Developer’s Cook Book》第1章 安卓概览
- 小试ImageMagik——使用篇
- PC的时间精确吗?
- 打造你的开发神器——介绍Android Studio上的几个插件
- Android开发秘籍学习笔记(十四)
- 关于Android应用如何正确存放文件
- 入职第一个月工资这样花,一年内工资至少可以再涨50%!
- 入职第一个月工资这样花,一年内工资至少可以再涨50%!
- 使用CentOS7配置Squid代理
- unix环境高级编程之线程篇(一)
- UIColor创建UIImage备忘
- AutoLayout 代码实现约束
- js获取get参数方法
- hbase的regionserver宕机
- hbase的regionserver宕机
- 二进制位运算积累备忘
- 在MAC上查找和设置$JAVA_HOME
- CS 4820 second lecture
- apache+tomcat 负载均衡
- cxf调用c#的webservice