关于背包问题的详细解释可以参见《背包九讲》
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=505;
const int maxm=100005;
int need[maxn],value[maxn],dp[maxm];
int main()
{
memset(dp,0,sizeof dp);
int n,m; cin>>n>>m;
for(int i=1;i<=n;++i) cin>>need[i]>>value[i];
for(int i=1;i<=n;++i)
for(int j=0;j<=m;++j)
if(j>=need[i]) dp[j]=max(dp[j],dp[j-need[i]]+value[i]);
cout<<dp[m]<<endl;
}