题目链接:

这个题目比1711难处理的是字符串怎样处理,所以我们要想办法,自然而然就要想到用结构体存储。所以最后将全部的衣服分组,然后将每组时间减半,看最多能装多少。最后求最大值。那么就非常愉快的转化成了一个01背包问题了。。。

hdu1711是说两个得到的价值要尽可能的相等。所以还是把全部的价值分为两半。最后01背包,那么这个问题就得到了解决。。

题目:

Washing Clothes
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;
}

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

Problem Description
Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.

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).
 
Input
Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the
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.
 
Output
For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.
 
Sample Input
2
10 1
20 1
3
10 1
20 2
30 1
-1
 
Sample Output
20 10
40 40
 
Author
lcy
 
Recommend
We have carefully selected several similar problems for you:  2159 2955 1087 1069 1231 
 

代码为

#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;
}

poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)的更多相关文章

  1. hdu1171Big Event in HDU(01背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. 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 ...

  3. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  4. HDU1171--Big Event in HDU(多重背包)

    Big Event in HDU   Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  5. 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 ...

  6. HDU1171-Big Event in HDU

    描述: Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don ...

  7. HDU 1171 Big Event in HDU dp背包

    Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s ...

  8. 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 ...

  9. HDU 1171 Big Event in HDU (多重背包变形)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. loadrunner 响应时间和TPS

    例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车 1.请问1秒钟最多能进几辆车?    TPS=10 2.每辆车需要多长时间进行响应?    reponse time = 1 3.改成20辆车 ...

  2. fabric的安装

    https://blog.csdn.net/lepton126/article/details/79148027

  3. Vue beaforeCreate时获取data中的数据

    异步获取即:通过    $this.$nextTick或者settimeout,这连dom都可以拿出来 beforeCreate() { this.$nextTick(function() { con ...

  4. 输入一个字符串输出ASCII的十六进制值

    #include <stdio.h> #include <string.h> #define LEN 1024 void main() { char s[LEN] = &quo ...

  5. CAD设置超链接(网页版)

    超链接(Hyperlink)可以看做是一个“热点”,它可以从当前Web页定义的位置跳转到其他位置. 设置对象动态提示事件回调函数. //设置对象动态提示事件回调函数 function DoInputP ...

  6. 拦截导弹问题(Noip1999)

    1322:[例6.4]拦截导弹问题(Noip1999) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 3843     通过数: 1373 [题目描述] 某国为了防 ...

  7. myeclipse出现Failed to load JavaHL Library.

    eclipse启动出现如图的状况: 解决方法: Window-Preferences-Team-SVN,在SVN接口的下拉框可以看到,默认选择的是JavaHL(JNI) Not Available,手 ...

  8. python 删除/查找重复项

    l = [1,2,3,2,1] # l = ['你','我','他','她','你'] for i in l: print("the %s has found %s" % (i, ...

  9. [C语言]输入一行整数,用空格分开,回车结束。

    在屏幕一行中的字符会保留在缓冲区,例如 1 2 3 4 5 6 ; i < n; i++) { scanf("%d",&cur); array[i] = cur; c ...

  10. Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

    感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...