01背包 poj3211 STL助攻

来源:互联网 发布:淘宝入驻条件费用标准 编辑:程序博客网 时间:2024/06/10 18:57

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;}
0 0