Problem:
Problem D:THE BYDOLM@STER

Description

THE BYDOLM@STER(バイドルマスター)とは1rem社より2010/4/1にEXIDNAで発売が予定されている育成シミュレーションゲームである。一応断っておくが、今月初めにネットワーク接続サービスが停止した某アーケードゲームとはたぶん関係が無い。

このゲームはバイドルたちからプロデュースするユニット(編隊)のメンバーを選択し、メンバーたちとのレッスンやコミュニケーションを通じて、彼女(彼)らをバイドルの頂点、トップバイドルに育て上げるゲームである。

各バイドルには能力値としてボーカル、ダンス、ルックスの3つのパラメータを持ち、ユニットの能力値はユニットに属している全てのバイドルのパラメータの合計値となる。ユニットの3つの能力値のうち最大の物がユニットのランクとなる。

ユニットに人数制限は無く、メンバーの人数が1体でも、3体でも、100体でもユニットとして活動できる。もちろん同じバイドルを複数雇うこと出来るが、バイドルを雇うためには費用がかかるのでこれを考慮に入れなければならない。

プロデューサーであるあなたは最高のユニットを作るためにプログラムを書いて計算することにした。

Input

入力は複数のテストケースからなる。

各テストケースの1行目にはバイドルの数Nと使用可能な費用Mが与えられる。(1<=N,M<=300)
次の2*N行には各バイドルに関しての情報が書かれている。

バイドルの情報の1行目にはバイドルの名前。バイドルの名前はアルファベットと空白から成り、30文字を以下である。また同一名のバイドルは存在しない。

2行目には整数C、V、D、Lが与えられる。Cはそのバイドルを1体雇用するコスト、Vはボーカル、Dはダンス、Lはルックスの能力値を表す。(1<=C,V,D,L<=300)

入力はEOFで終わる。

Output

与えられた費用の中で作れるユニットのランクの最大値を答えよ。

ユニットが作れない場合は0を出力せよ。

Sample Input

3 10
Dobkeradops
7 5 23 10
PataPata
1 1 2 1
dop
5 3 11 14
2 300
Bydo System Alpha
7 11 4 7
Green Inferno
300 300 300 300

Output for Sample Input

29
462

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace THE_BYDOLMASTAR
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string line = Console.ReadLine();
                if (line == null) break;
                string[] strs = line.Split(' ');
                int BydoCount = int.Parse(strs[0]);
                int maxCost = int.Parse(strs[1]);

                List<Bydo> bydos = new List<Bydo>();
                for (int i = 0; i < BydoCount; i++)
                {
                    string name = Console.ReadLine();
                    line = Console.ReadLine();
                    strs = line.Split(' ');
                    int cost = int.Parse(strs[0]);
                    int vocal = int.Parse(strs[1]);
                    int dance = int.Parse(strs[2]);
                    int looks = int.Parse(strs[3]);

                    bydos.Add(new Bydo(name, cost, vocal, dance, looks));
                }

                DynamicProgramming bynamicProgramming = new DynamicProgramming(bydos, maxCost);
                Console.WriteLine(bynamicProgramming.Solve());
            }
        }
    }

    public class DynamicProgramming {

        private List<Bydo> bydos;

        private int maxCost;

        private int[,] dp;

        public DynamicProgramming(List<Bydo> bydos, int maxCost)
        {
            this.bydos = bydos;
            this.maxCost = maxCost;
            this.dp = new int[bydos.Count + 1, maxCost + 1];
        }

        public int Solve()
        {
            for (int i = 0; i < bydos.Count; i++)
            {
                for (int j = 0; j <= maxCost; j++)
                {
                    if (j < bydos[i].Cost)
                    {
                        dp[i + 1, j] = dp[i, j];
                    }
                    else
                    {
                        dp[i + 1, j] = Math.Max(dp[i, j], dp[i + 1, j - bydos[i].Cost] + bydos[i].GetRank());
                    }
                }
            }
            return dp[bydos.Count, maxCost];
        }

    }

    public class Bydo
    {
        public string Name { get; private set; }
        public int Cost { get; private set; }
        public int Vocal { get; private set; }
        public int Dance { get; private set; }
        public int Looks { get; private set; }

        public Bydo(string name, int cost, int vocal, int dance, int looks)
        {
            Name = name;
            Cost = cost;
            Vocal = vocal;
            Dance = dance;
            Looks = looks;
        }

        public int GetRank()
        {
            return Math.Max(Vocal, Math.Max(Dance, Looks));
        }
    }
}