#include<stdio.h>
#include<string.h> int n,m,dp[10001]; int max(int a,int b) { return a>b?a:b; } void yi(int val,int co) { int i; for(i=m;i>=co;i--) dp[i]=max(dp[i],dp[i-co]+val); } void duo(int val,int co) { int i; for(i=co;i<=m;i++) dp[i]=max(dp[i],dp[i-co]+val); } void seach(int val,int co,int num) { if(co*num>m) duo(val,co); else { int k=1; while(k<num) { yi(val*k,co*k); num-=k; k*=2; } yi(num*val,co*num); } } int main() { int p[11][11],i,j,k,t; char s[101]; while(scanf("%d%d",&n,&m)!=EOF) { memset(p,0,sizeof(p)); int a,b; while(n--) { scanf("%s%d%d",s,&a,&b); p[a][b]++; } memset(dp,0,sizeof(dp)); for(i=0;i<=10;i++) for(j=0;j<=10;j++) if(p[i][j]) seach(i,j,p[i][j]); printf("%d\n",dp[m]); } return 0; }另附详解地址: