bug一开始头昏脑胀把dp[0]的值赋值为1
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const ll maxn=1010*100;
int K,N;
int dp[maxn];
int main()
{
//freopen("D://in.txt","r",stdin);
while(scanf("%d%d",&K,&N)!=EOF){
if(K==0&&N==0) break;
map<string ,vector<int> >m;
m.clear();
for(int i=0;i<K;i++){
string s;
cin>>s;
m[s].clear();
}
for(int i=1;i<=N;i++){
int u;
scanf("%d",&u);
string s;
cin>>s;
m[s].push_back(u);
}
map<string ,vector<int> >::iterator it;
int sum=0;
for(it=m.begin();it!=m.end();it++){
int n=it->second.size();
if(n==0 ) continue;
vector<int> &v=it->second;
int W=0;
for(int i=0;i<n;i++)
W+=v[i];
for(int i=0;i<=n;i++){
for(int j=0;j<=W;j++) dp[j]=0;
}
dp[0]=0;
for(int i=0;i<n;i++){
for(int j=W;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
//printf("dp %d %d\n",dp[W/2],W-dp[W/2]);
sum+=max(dp[W/2],W-dp[W/2]);
}
printf("%d\n",sum);
}
return 0;
}