首页 > 代码库 > POJ 3211Washing Clothes

POJ 3211Washing Clothes

只能说,无情的一题抓狂,比赛的时候看出来跟杭电的1171一样分成两部分01背包就可以了,但是WS的字符串深刻的暴露了我掉渣的C语言功底,不得不用map写,结果有个小小的地方没处理好,搞得样例过不了。。。最终队友看不下去,放下手正在推的公式,上去用字符串两WA两发后AC了。。。

我AC的代码:

#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define N 2222
using namespace std;

map<string,int>mp;
int sum[N];
int num[N];
int dp[N];
int f[15][N];
int main()
{
    int m,n;
    char str[N];
    while(~scanf("%d%d",&m,&n))
    {
        if(m+n==0)break;
        memset(num,0,sizeof num);
        memset(sum,0,sizeof sum);
        memset(dp,0,sizeof dp);
        int time;
        memset(f,0,sizeof f);
        for(int i=1;i<=m;i++)
        {
            scanf("%s",str);
            mp[str]=i;//存编号的数组
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d %s",&time,str);
            //cout<<mp[str]<<endl;
            sum[mp[str]]+=time;//记录某种颜色的总时间
            num[mp[str]]++;//记录某种颜色的总件数
            f[mp[str]][num[mp[str]]]=time;//编号为mp[str]的第j件衣服
        }
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            int v=(sum[i]+1)/2;
            for(int j=1;j<=num[i];j++)
            for(int k=v;k>=f[i][j];k--)
            {
                dp[k]=max(dp[k],dp[k-f[i][j]]+f[i][j]);
            }
            ans+=max(dp[v],sum[i]-dp[v]);
            memset(dp,0,sizeof dp);//之前忘记清零了,wa了几下
        }
        printf("%d\n",ans);
    }
    return 0;
}


/*
2 6
blue red
2 red
8 red
3 blue
5 red
4 blue
6 red

3 7
blue red yy
2 red
8 red
3 blue
5 red
4 blue
6 red
3 yy
3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0
*/

队友的代码:

#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define N 22220
using namespace std;

struct Node
{
    int t;
    string str;
}node[N];
int dp[N];
int cmp(Node a,Node b)
{
    return a.str>b.str;
}

int main()
{
    int m,n,i,j;
    char c[20];

    while(~scanf("%d%d",&m,&n))
    {
        if(n+m==0) break;
        for(int i=0;i<m;i++)
           scanf("%s",c);

        for(int i=0;i<n;i++)
        {
            scanf("%d",&node[i].t);
            cin>>node[i].str;

        }
        sort(node,node+n,cmp);
        int k=0;
        int a[N],sum;
        int ans=0;

        for(i=0;i<n;)
        {
           for(j=i;j<n;j++)
                if(node[j].str!=node[j+1].str)
                    break;

            k=0;sum=0;
           for(i;i<=j&&i<n;i++)
           {
               a[k++]=node[i].t;
               sum+=node[i].t;
           }

            memset(dp,0,sizeof(dp));

            int va=sum/2;

            for(int te=0;te<k;te++)
                for(int v=va;v>=a[te];v--)
                  dp[v]=max(dp[v-a[te]]+a[te],dp[v]);

            ans+=max(dp[va],sum-dp[va]);
        }

        printf("%d\n",ans);
    }
    return 0;
}