poj 3211 01 背包

来源:互联网 发布:2010江苏高考数学知乎 编辑:程序博客网 时间:2024/06/09 19:24
#include<stdio.h>#include<string.h>int m,n;char str[15][15];int col[110][22];bool dp[200000];int t[110],s[110],g[110][110];int getid(char *s){for(int i=0;i<m;i++)if(strcmp(s,str[i])==0) return i;return 0;}int main(){   int i,j,k;   char tmp[15];   while(scanf("%d%d",&m,&n)!=EOF)   {   if(n==0&&m==0) break;       for(i=0;i<m;i++)scanf("%s",str[i]),t[i]=s[i]=0;   for(i=0;i<n;i++)   {   scanf("%d%s",&k,tmp);   s[j=getid(tmp)]+=k;   g[j][t[j]++]=k;   }   int ans;   for(ans=k=0;k<m;k++)   {   for(i=0;i<=s[k]/2;i++) dp[i]=0;   dp[0]=1;   for(i=0;i<t[k];i++)   for(j=s[k]/2;j>=g[k][i];j--)   if(dp[j-g[k][i]]) dp[j]=1;   for(i=s[k]/2;i>=0;i--)   if(dp[i]) break;   ans+=s[k]-i;   }   printf("%d\n",ans);   }   return 0;}

  

原创粉丝点击