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 ...
随机推荐
- POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28399 Accepted: 9684 De ...
- HDU——4565So Easy!(矩阵快速幂)
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- BZOJ2938 [Poi2000]病毒 【AC自动机】
题目 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否存在 ...
- Eclipse项目类型转换
例如,将一个普通java项目改为动态Web项目: 在eclipse的项目上点右键,刷新项目. 在项目上点右键,进入属性(properties) 在左侧列表项目中点击选择“Project Facets” ...
- springboot中如果使用了@Autowired注入了bean,则这个类也要为spring bean,new出来注入的bean为null
https://blog.csdn.net/Mr_Runner/article/details/83684088 问题:new出来的实例中含有@Autowired注入时,注入的Bean为null: 解 ...
- scrapy爬取用户信息 ---崔志才
这个实例还是值得多次看的 其流程图如下,还是有一点绕的. 总结: 1 Requst(rul=' xxx ',callback= ' '),仅仅发起 某个网页 的访问请求,没啥了.剩下的交给回调函数 2 ...
- js 函数arguments一种用法
无意改同事的代码发现的 function toggle(){ var _arguments=arguments; var count=0; $("#more").click(fun ...
- 【Visual Studio】Tab 转换为空格的设置
在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效 果.Visual Studio 提供了这样的功能,具体设置方法为:打开 “To ...
- pycharm提示your evalluation license has expired解决方法
安装pycharm,一段时间后提示your evalluation license has expired:打开pycharm--点击help--register--选中license server, ...
- 无密码登录Linux
配置主机A无密码登录主机B 主机A:192.168.1.110 主机B:192.168.1.111 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh 2. $ss ...