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