#55349: c++ dp 解法


61247091s@gapps.ntnu.edu.tw (wei)


#include <bits/stdc++.h>
using namespace std;

const int MAX=105;
int  m[10005][105];

int cnt(int w,int n,int b[MAX][2]){
    if(w<0)return -1e9;
    if(n<0)return 0;

    if(m[w][n]!=-1)return m[w][n];

    int take=cnt(w-b[n][0],n-1,b)+b[n][1];
    int skip=cnt(w,n-1,b);

    m[w][n]=max(take,skip);
    return m[w][n];
}

int main(){
    int num,weight;
    while(cin>>num){
    int a[MAX][2];
    for(int i=0;i<num;i++) cin>>a[i][0]>>a[i][1];
    cin>>weight;
    memset(m,-1,sizeof(m));
    cout<<cnt(weight,num-1,a)<<endl;}
    return 0;
}