poj 3211 01 背包
#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; }