经典的01背包,做完hihocoder那道题后开始啃背包。。。
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =3505;
int n,m;
int w[maxnum],d[maxnum];
int dp[2][12900];
int main()
{
//ifstream fin("G:/1.txt");
scanf("%d%d",&n,&m);
ms(w);ms(d);ms(dp);
FOR(i,1,n){
scanf("%d%d",&w[i],&d[i]);
}
FOR(i,1,n){
FOR(j,0,m){
dp[i%2][j]=max(dp[1-i%2][j],dp[i%2][j]);
if(j<w[i])continue;
dp[i%2][j] = max(dp[i%2][j],dp[1-i%2][j-w[i]]+d[i]);
}
}
int ans =0;
int tar = n%2;
FOR(i,0,m){
ans=max(ans,dp[tar][i]);
}
cout<<ans<<endl;
return 0;
}