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; }