#include<iostream>
#include<algorithm>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<cctype>
#include<vector>
#include<limits.h>
#include<queue>
using namespace std;
int w[3500]; //体积
int d[3500]; //价值
int dp[13000];
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=1; i<=n; ++i)
{
scanf("%d%d",&w[i],&d[i]);
}
for(i=1; i<=n; ++i)
{
//将二维数组缩减为一位数组
// for(j=w[i]; j<=m; ++j)
// {
// dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+d[i]);
// }
//因为dp[i][j]只与dp[i-1]相关,所以只需要一维数组就可以,
//但是,要从后往前遍历,因为dp[j]要用dp[j-..]来推出
for(j=m; j>=w[i]; j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
}
}
printf("%d\n",dp[m]);
return 0;
}
思路已经差不多明了了,都是将大问题分解为子问题,,,