zoukankan      html  css  js  c++  java
  • poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

    题目链接:

    这个题目比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;
    }


  • 相关阅读:
    Android中的IMEI
    《JAVA与模式》之适配器模式(转)
    海量日志数据__怎么在海量数据中找出重复次数最多的一个
    Java中的IO流系统详解(转载)
    获取网络文件长度问题
    内存泄漏
    Ubuntu12.04不能连接小米开发(转)
    Java/C++中数组的区别
    Android批量插入数据到SQLite数据库
    泛型编程 基础
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5245472.html
Copyright © 2011-2022 走看看