poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)
题目链接:
这个题目比1711难处理的是字符串怎样处理,所以我们要想办法,自然而然就要想到用结构体存储。所以最后将全部的衣服分组,然后将每组时间减半,看最多能装多少。最后求最大值。那么就非常愉快的转化成了一个01背包问题了。。。
。
hdu1711是说两个得到的价值要尽可能的相等。所以还是把全部的价值分为两半。最后01背包,那么这个问题就得到了解决。。
题目:
| Time Limit: 1000MS | Memory Limit: 131072K | |
| Total Submissions: 8637 | Accepted: 2718 |
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 Mstrings 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
Source
代码为:
#include<cstdio>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100000+10;
int dp[maxn];
struct clothes
{
int num;//颜色同样的衣服的编号
int sum;//颜色形同的衣服的总数
char color[100];//颜色
int time[105];//颜色同样的不同衣服的时间
}clo[10+10];
int main()
{
int m,n,u,max_pack,ans;
char str[100+10];
while(~scanf("%d%d",&m,&n))
{
if(n==0&&m==0) return 0;
for(int i=1;i<=m;i++)
{
scanf("%s",clo[i].color);
clo[i].num=1;
clo[i].sum=0;
}
for(int i=1;i<=n;i++)
{
scanf("%d%s",&u,str);
for(int j=1;j<=m;j++)
{
if(strcmp(str,clo[j].color)==0)
{
int tmp=clo[j].num;
clo[j].time[tmp]=u;
clo[j].sum=clo[j].sum+u;
clo[j].num++;
}
}
}
for(int i=1;i<=m;i++)
clo[i].num--;
ans=0;
for(int i=1;i<=m;i++)
{
memset(dp,0,sizeof(dp));
max_pack=clo[i].sum/2;
for(int j=1;j<=clo[i].num;j++)
for(int k=max_pack;k>=clo[i].time[j];k--)
dp[k]=max(dp[k],dp[k-clo[i].time[j]]+clo[i].time[j]);
ans=ans+max(dp[max_pack],clo[i].sum-dp[max_pack]);
}
cout<<ans<<endl;
}
return 0;
}
#include<map>
#include<iostream>
#include<cstring>
using namespace std; const int maxn=100000+10;
int dp[maxn]; struct clothes
{
int num;//颜色同样的衣服的编号
int sum;//颜色形同的衣服的总数
char color[100];//颜色
int time[105];//颜色同样的不同衣服的时间
}clo[10+10]; int main()
{
int m,n,u,max_pack,ans;
char str[100+10];
while(~scanf("%d%d",&m,&n))
{
if(n==0&&m==0) return 0;
for(int i=1;i<=m;i++)
{
scanf("%s",clo[i].color);
clo[i].num=1;
clo[i].sum=0;
}
for(int i=1;i<=n;i++)
{
scanf("%d%s",&u,str);
for(int j=1;j<=m;j++)
{
if(strcmp(str,clo[j].color)==0)
{
int tmp=clo[j].num;
clo[j].time[tmp]=u;
clo[j].sum=clo[j].sum+u;
clo[j].num++;
}
}
}
for(int i=1;i<=m;i++)
clo[i].num--;
ans=0;
for(int i=1;i<=m;i++)
{
memset(dp,0,sizeof(dp));
max_pack=clo[i].sum/2;
for(int j=1;j<=clo[i].num;j++)
for(int k=max_pack;k>=clo[i].time[j];k--)
dp[k]=max(dp[k],dp[k-clo[i].time[j]]+clo[i].time[j]);
ans=ans+max(dp[max_pack],clo[i].sum-dp[max_pack]);
}
cout<<ans<<endl;
}
return 0;
}
hdu1171 题目:
Big Event in HDU
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 23302 Accepted Submission(s): 8206
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is
N (0<N<1000) kinds of facilities (different value, different kinds).
facilities) each. You can assume that all V are different.
A test case starting with a negative integer terminates input and this test case is not to be processed.
2
10 1
20 1
3
10 1
20 2
30 1
-1
20 10
40 40
代码为
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=250000+10;
int dp[maxn];
int sum[50+10],val[50+10];
int kind[5000+10];
int main()
{
int n,max_pack,ans,cal,Max;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
if(n<=0) return 0;
cal=1;
max_pack=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&val[i],&sum[i]);
max_pack+=sum[i]*val[i];
for(int j=1;j<=sum[i];j++)
{
kind[cal]=val[i];
cal++;
}
}
cal--;
Max=max_pack/2;
for(int i=1;i<=cal;i++)
for(int j=Max;j>=kind[i];j--)
dp[j]=max(dp[j],dp[j-kind[i]]+kind[i]);
ans=max(dp[Max],max_pack-dp[Max]);
cout<<ans<<" "<<max_pack-ans<<endl;
}
return 0;
}
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int maxn=250000+10;
int dp[maxn]; int sum[50+10],val[50+10];
int kind[5000+10]; int main()
{
int n,max_pack,ans,cal,Max;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
if(n<=0) return 0;
cal=1;
max_pack=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&val[i],&sum[i]);
max_pack+=sum[i]*val[i];
for(int j=1;j<=sum[i];j++)
{
kind[cal]=val[i];
cal++;
}
}
cal--;
Max=max_pack/2;
for(int i=1;i<=cal;i++)
for(int j=Max;j>=kind[i];j--)
dp[j]=max(dp[j],dp[j-kind[i]]+kind[i]);
ans=max(dp[Max],max_pack-dp[Max]);
cout<<ans<<" "<<max_pack-ans<<endl;
}
return 0;
}
poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)的更多相关文章
- hdu1171Big Event in HDU(01背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1171 Big Event in HDU (01背包, 母函数)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HUD 1171 Big Event in HDU(01背包)
Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...
- HDU1171--Big Event in HDU(多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1171 Big Event in HDU 多重背包二进制优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...
- HDU1171-Big Event in HDU
描述: Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don ...
- HDU 1171 Big Event in HDU dp背包
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s ...
- HDU - 1171 Big Event in HDU 多重背包
B - Big Event in HDU Nowadays, we all know that Computer College is the biggest department in HDU. B ...
- HDU 1171 Big Event in HDU (多重背包变形)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- js 类似于移动端购物车删除,左移动删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- com口操作excel
_Application app; //Excel应用程序接口 Workbooks books; //工作薄集合 _Workbook book; //工作薄 Work ...
- http 1.0 http 1.1 http 2.0的区别
HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求.发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接. http1.1优点: 1.HTTP 1.1 版引入了持久连接( ...
- 06JavaScript函数
JavaScript函数 3.1系统函数 3.1.1编码函数 功能:将字符串中非文字.数字字符(如&,%,#,^,空格符…)转成相对应的ASCII值. 语法:escape(字符串) 3.1.2 ...
- NET使用SuperSocket完成TCP/IP通信
1)为什么使用SuperSocket? 性能高,易上手.有中文文档,我们可以有更多的时间用在业务逻辑上,SuperSocket有效的利用自己的协议解决粘包 2)SuperSocket的协议内容? 命令 ...
- Ubuntu下systemd服务的配置
1. 在/lib/systemd/system目录下创建服务启动脚本testservice.service 2. 文件内容如下: [Unit] Description=TestService [Ser ...
- cookie和session的区别及session的生命周期
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录 ...
- STM32串口程序的一般配置方法
#include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...
- 杭电 1862 EXCEL排序(sort+结构体)
Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000 ...
- spring+orm框架的兼容问题
Springframework和Hibernate版本对应关系 org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework ...