poj 3211 Washing Clothes(背包)

时间:2023-03-09 16:21:12
poj 3211 Washing Clothes(背包)

很不错的01背包!!!

不过有点疑问!!!(注释)

#include <algorithm>

#include<stdio.h>

#include<string.h>
using namespace std;

#define max(a,b) a>b?a:b

struct node

{


char cl[50];


int a;

}aa[200];

int cmp(node a,node b)

{


return strcmp(a.cl,b.cl)>0;

}

int main()

{


int n,m,i,j,q,w,bb[50000],ans,sum,b[50000];


char str[50];


while(scanf("%d%d",&n,&m),n+m)


{


for(i=0;i<n;i++)


scanf("%s",str);


for(i=0;i<m;i++)


scanf("%d %s",&aa[i].a,aa[i].cl);


sort(aa,aa+m,cmp);


aa[m].cl[0]='0';aa[m].cl[1]='\0';//防止下面的访问越界


w=0;ans=0;sum=0;


for(i=0;i<m;i++)


{


if(strcmp(aa[i].cl,aa[i+1].cl)==0)


{


sum=sum+aa[i].a;


b[w++]=aa[i].a;


}


else


{


b[w++]=aa[i].a;


sum+=aa[i].a;


memset(bb,0,sizeof(bb));


int vv=sum/2;


for(j=0;j<w;j++)


for(q=vv;q>=b[j];q--)


bb[q]=max(bb[q],bb[q-b[j]]+b[j]);


ans+=max(sum-bb[vv],bb[vv]);//我这里写成ans=ans+max(sum-bb[vv],bb[vv]);结果就不对了,郁闷!!!


//
printf("%d %d\n",sum-bb[vv],bb[vv]);


w=0;sum=0;


}

}


printf("%d\n",ans);


}


return 0;

}

题目链接:http://poj.org/problem?id=3211