POJ 3211 Washing Clothes(01背包)
POJ 3211 Washing Clothes(01背包)
http://poj.org/problem?id=3211
题意:
有m (1~10)种不同颜色的衣服总共n (1~100)件。Dearboy和她的girlfriend两个人要一起洗完所有衣服,为了预防色彩混合,他们每次仅仅能同一时候洗同一种颜色的衣服,给出洗完每件衣服所需的时间time和它的颜色color,求出Dearboy和她的girlfriend最少用多少时间能洗完毕所有衣服。
分析:
因为每种颜色的衣服是分开洗的, 所以我们能够把全部衣服按颜色分类, 然后每次看洗一种颜色的衣服最少须要花多少时间就可以.
如果当前第i种颜色的衣服要洗, 因为有两个人, 我们明显让这两个人洗衣服的时间尽量平均才干使得该种衣服洗的时间尽量短.
那么这就是一个01背包问题了, 选择衣服使得一个人洗衣服的时间在<=sum/2的前提下尽量长.
对于同一种颜色的衣服有以下01背包过程:
令dp[i][j]=x表示仅仅在前i件衣服里面选且总时间<=j时, 能达到的最大时间为x.
初始化: dp全为0.
状态转移: dp[i][j] = max( dp[i-1][j] , dp[i-1][j-time[i]]+time[i])
终于所求: 该种衣服所花时间== sum-dp[n][sum/2]. 当中sum为该种衣服所花时间总和.
终于我们把每种衣服花的时间累加起来就可以得到ans.
AC代码:
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
const int maxn=100000+5; int n; //衣服件数
int m; //颜色种数
int dp[maxn];
int num[10+5]; //num[i]=x表第i类颜色衣服有x个
int val[10+5][100+5];//val[i][j]=x表第i类颜色的第j个衣服须要花x时间洗
map<string,int> mp; //颜色与编号的映射 int main()
{
while(scanf("%d%d",&m,&n)==2)
{
if(n==0&&m==0) break;
memset(num,0,sizeof(num)); //读取输入,存入相应数组
for(int i=1;i<=m;i++)
{
string s;
cin>>s;
mp[s]=i;
}
for(int i=1;i<=n;i++)
{
int x;
string s;
cin>>x>>s;
int type=mp[s];
val[type][++num[type]]=x;
} //做最多m次01背包
int ans=0;
for(int k=1;k<=m;k++)
{
//1次01背包
int sum=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=num[k];i++)
sum+= val[k][i];
for(int i=1;i<=num[k];i++)
{
for(int j=sum/2;j>=val[k][i];j--)
dp[j] = max(dp[j], dp[j-val[k][i]]+val[k][i]);
}
//累计结果
ans+= sum-dp[sum/2];
}
printf("%d\n",ans);
}
return 0;
}
POJ 3211 Washing Clothes(01背包)的更多相关文章
- POJ 3211 Washing Clothes 0-1背包
题目大意: xxx很懒,但他有个漂亮又勤奋的女友 (尼玛能不能不刺激我,刚看到这题的时候发现自己的衣服没洗!!!) 可以帮他洗衣服. 洗衣服的时候要求不同的颜色的衣服不能同时洗.一人洗一件的话,问最短 ...
- POJ 3211 Washing Cloths(01背包变形)
Q: 01背包最后返回什么 dp[v], v 是多少? A: 普通01背包需要遍历, 从大到小. 但此题因为物品的总重量必定大于背包容量, 所以直接返回 dp[V] 即可 update 2014年3月 ...
- poj 3211 Washing Clothes(背包)
很不错的01背包!!! 不过有点疑问!!!(注释) #include <algorithm> #include<stdio.h> #include<string.h> ...
- [POJ 3211] Washing Clothes (动态规划)
题目链接:http://poj.org/problem?id=3211 题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色.现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的 ...
- poj 3211 Washing Clothes
// 题意 :夫妻两洗衣服,衣服有m种颜色,每种颜色又有若干件,每件衣服洗完需要特定的时间,要求每种颜色放在一起洗,洗完才能洗其他衣服.最后问洗完需要的最少时间// 将衣服按颜色分类 然后求出每种颜色 ...
- POJ 3211 Washing Clothes【01背包】
题意:给出n种颜色,m件衣服,再分别给出m件衣服的颜色,和洗所需要的时间,dearboy和他的妹子一起洗衣服,且同种颜色的衣服不能同时洗,也不能两个人同时洗一件衣服,问洗完这m件衣服至少需要的时间 先 ...
- POJ 3211 Washing Clothes 背包题解
本题是背包问题,可是须要转化成背包的. 由于是两个人洗衣服,那么就是说一个人仅仅须要洗一半就能够了,由于不能两个人同一时候洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服须要 ...
- [POJ 2184]--Cow Exhibition(0-1背包变形)
题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 3624 Charm Bracelet(01背包裸题)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38909 Accepted: 16862 ...
随机推荐
- 百度网络监控实战:NetRadar横空出世(下)
原文:https://mp.weixin.qq.com/s/CvCs-6rX8Lb5vSTSjYQaBg 转自订阅号「AIOps智能运维」,已授权运维帮转发 作者简介:运小贝,百度高级研发工程师 负责 ...
- 按 Tab 在多个 InputField 间切换
下面这个链接里的有些unity的东西还没搞懂..改天继续看 http://forum.unity3d.com/threads/tab-between-input-fields.263779/ if(I ...
- 高阶函数之函数柯里化function currying
var cost = (function(){ var args = []; return function(){ if(arguments.length === 0){ ...
- 论epoll的实现
论epoll的实现 上一篇博客 论select的实现 里面已经说了为什么 select 比较慢.poll 的实现和 select 类似,只是少了最大 fd 限制,如果有兴趣可以自己去看代码.我这里来简 ...
- ../wxs/utils.wxs not found from
../wxs/utils.wxs not found from 微信小程序,使用Vant Weapp时,引入到项目中时报以下错误: ... ../wxs/utils.wxs not found fro ...
- CF997D
分析: 假设在第一个树上我们有一个长度为x的环,在第二树上我们有一个长度为y的环,那么可以在叉积树上构造出$\binom{x+y}{x}$个长度为x+y的环 问题的关键就变成了如何统计出在一个树上的长 ...
- 1.搭建maven,eclipse创建maven项目
1.下载maven包,下载地址为:http://maven.apache.org/download.cgi 2.解压zip包 3.eclipse 引入maven: window-Preferences ...
- http put/delete方式请求
HttpClient使用Delete方式提交数据 1. http请求主要有以下几种方法来对指定资源做不同操作: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指 ...
- java后4位打成*显示
/** * [固定电话] 后四位,其他隐藏<例子:****1234> * * @param num * @return */ public static String fixedPhone ...
- 数组对象(NSArray和NSMutableArrray)
Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,'b’,'c’};Foundation还提供了NSArray类.Foundation是有序的对 ...