只能说,无情的一题,比赛的时候看出来跟杭电的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;
}