POJ 3211 Washing Cloths(01背包变形)
Q: 01背包最后返回什么 dp[v], v 是多少?
A: 普通01背包需要遍历, 从大到小. 但此题因为物品的总重量必定大于背包容量, 所以直接返回 dp[V] 即可
update 2014年3月14日11:22:55
1. 几个月后, 感觉返回的不应该是 dp[V], 二是 dp[0...V] 中的最大值
Description
Dearboy was so busy recently that now he has piles of clothes to wash. Luckily, he has a beautiful and hard-working girlfriend to help him. The clothes are in varieties of colors but each piece of them can be seen as of only one color. In order to prevent the clothes from getting dyed in mixed colors, Dearboy and his girlfriend have to finish washing all clothes of one color before going on to those of another color.
From experience Dearboy knows how long each piece of clothes takes one person to wash. Each piece will be washed by either Dearboy or his girlfriend but not both of them. The couple can wash two pieces simultaneously. What is the shortest possible time they need to finish the job?
Input
The input contains several test cases. Each test case begins with a line of two positive integers M and N (M < 10, N < 100), which are the numbers of colors and of clothes. The next line contains M strings which are not longer than 10 characters and do not contain spaces, which the names of the colors. Then follow N lines describing the clothes. Each of these lines contains the time to wash some piece of the clothes (less than 1,000) and its color. Two zeroes follow the last test case.
Output
For each test case output on a separate line the time the couple needs for washing.
Sample Input
3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0
Sample Output
10
思路:
1. 先将颜色相同的衣服聚类到一起
2. 对某一种颜色的衣服两人开洗, 这就涉及到01背包的变形, 即如何分配衣服使得总时间最小. 解法是将背包容量设置为总容量的一半, 然后进行01背包
总结:
1. map 和 vector<vector<> > 搭配的不够默契, 与 vector in[MAXN] 比较默契
2. memset 减少时间的方法, memset(dp, 0, sizeof(int)*(V+1));
3. 这里, 因此 V 是 sum/2 后的结果, 所以最终会填满背包, 返回 dp[V] 即可
代码:
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std; int M, N;
vector<int> cloth[11];
map<string, int> color;
int dp[100010];
int solve_dp() {
int sum = 0;
for(int index = 0; index < M; index++) {
int V = 0;
for(int j = 0; j < cloth[index].size(); j ++) {
V += cloth[index][j];
}
int rem = V&1;
memset(dp, 0, sizeof(int)*(V+1));
V = V>>1;
for(int j = 0; j < cloth[index].size(); j ++) {
int wj = cloth[index][j];
for(int k = V; k >= wj; k --) {
dp[k] = max(dp[k], dp[k-wj]+wj);
}
}
sum += ((V<<1)+rem)-dp[V]; }
return sum;
} int main() {
freopen("E:\\Copy\\ACM\\测试用例\\in.txt", "r", stdin); while(scanf("%d%d", &M, &N) && M != 0) {
string str;
color.clear();
for(int i = 0; i < M; i ++)
cloth[i].clear();
for(int i = 0; i < M; i ++) {
cin >> str;
color[str] = i;
}
int t;
for(int i = 0; i < N; i ++) {
cin >> t >> str;
cloth[color[str]].push_back(t);
}
cout << solve_dp() << endl;
}
return 0;
}
POJ 3211 Washing Cloths(01背包变形)的更多相关文章
- POJ 3211 Washing Clothes(01背包)
POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...
- POJ 3211 Washing Clothes 0-1背包
题目大意: xxx很懒,但他有个漂亮又勤奋的女友 (尼玛能不能不刺激我,刚看到这题的时候发现自己的衣服没洗!!!) 可以帮他洗衣服. 洗衣服的时候要求不同的颜色的衣服不能同时洗.一人洗一件的话,问最短 ...
- [POJ 2184]--Cow Exhibition(0-1背包变形)
题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10342 Accepted: 4048 D ...
- FZU 2214 Knapsack problem 01背包变形
题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- CF#214 C. Dima and Salad 01背包变形
C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...
随机推荐
- angularJS绑定数据中对标签转义的处理二 与pre标签的使用
一.问题 默认情况下,angularJS绑定的数据为字符串文本,不会对其中包含的html标签进行转义生成格式化的文本.在实际工作时碰到接口返回的数据带有html格式时该如何处理. 二.解决办法 1.引 ...
- 给class添加id封装
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- LeetCode: Surrounded Regions 解题报告
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
- java 日期获取时间戳
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); String dateS ...
- c++之——抽象基类
在一个虚函数的声明语句的分号前加上 =0:就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处.纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类 ...
- AES加解密JS和php互相处理字符
Reference: http://blog.csdn.net/carlos__z/article/details/53185082 JavaScript code? 1 2 3 4 5 6 7 8 ...
- Java调用存储过程小结
学生在学习jdbc的时候,会问到怎么调用存储过程,现在将java调用oracle存储过程的示例总结如下.(关于调用sqlserver的存储过程将在下次进行小结请关注) 一:无返回值的存储过程 存储过程 ...
- 基于jQuery左右滑动切换图片代码
分享一款基于jQuery左右滑动切换图片代码.这是一款基于jQuery实现的左右滑动切换焦点图代码.效果图如下: 在线预览 源码下载 实现的代码: <div class="v_ou ...
- SpringMVC 多个数据源 配置多个事物管理器 Multiple Transaction Managers
http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction ...
- pip使用国内镜像,豆瓣、清华
pip使用国内镜像,豆瓣.清华 2017年01月18日 22:27:44 阅读数:4416 Python开发的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导 ...