Problem 2219 : THE BYDOLM@STER

解法

最大となる能力の種類を決めうちするとナップサック問題になる。
すなわち、ナップサック問題をそれぞれの能力値について3回解けばよい。


このナップサック問題は同じものを何度も使ってよいタイプ。
プログラミングコンテストチャレンジブックの例題にあるやつ)


"名前には空白が含まれる"とあるが、空白だけが名前の人も居るため、
scanf("%d ")で空白文字を読み飛ばした後にfgetsを使おうとするとWAとなる。
下のようにfgetsを二度使わなければならない。

ソースコード

char dmy[32];
int n,m;
int c[300],v[300],d[300],l[300];
int V[301],D[301],L[301];

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		rep(i,n)
		{
			fgets(dmy,31,stdin); fgets(dmy,31,stdin);
			scanf("%d%d%d%d",c+i,v+i,d+i,l+i);
		}
		rep(i,m+1)V[i]=D[i]=L[i]=0;
		rep(i,n)for(int j=c[i];j<=m;j++)
		{
			V[j]=max(V[j],V[j-c[i]]+v[i]);
			D[j]=max(D[j],D[j-c[i]]+d[i]);
			L[j]=max(L[j],L[j-c[i]]+l[i]);
		}
		printf("%d\n",max(V[m],max(D[m],L[m])));
	}
	return 0;
}