AOJ : 2219 - THE BYDOLM@STER

アルゴリズム

各能力値を別々に考えて, 動的計画法によって最大合計値を求めます.
そうすると, ボーカル, ダンス, ルックスのそれぞれの最大合計値が出ます.
あとは, その中の最大値が, ユニットのランク最大値となります.
メモ化+再帰でやってます.

プログラム

#include <iostream>
#include <cstring>
using namespace std;

int n,m;
int c[301],v[301],d[301],l[301];
int dp[301][301];

int solve(int idx,int rem,int *t){
  if(idx == n) return 0;
  if(dp[idx][rem] != -1) return dp[idx][rem];
  int res = 0;
  for(int i=0;i*c[idx]<=rem;i++){
    res = max(res,i*t[idx]+solve(idx+1,rem-i*c[idx],t));
  }
  return dp[idx][rem]=res;
}

int main(void){
  while(cin>>n>>m){
    for(int i=0;i<n;i++){
      char ch = getchar();
      while((ch=getchar()) != '\n');
      cin>>c[i]>>v[i]>>d[i]>>l[i];
    }

    int ans = 0;
    memset(dp,-1,sizeof(dp));
    ans = max(ans,solve(0,m,v));
    memset(dp,-1,sizeof(dp));
    ans = max(ans,solve(0,m,d));
    memset(dp,-1,sizeof(dp));
    ans = max(ans,solve(0,m,l));
    cout<<ans<<endl;
  }

  return 0;
}