#include <cstring>
#include <iostream>
using namespace std;
int v[100100],w[100100],dp[1100][1010];
int main() {
int V,n;
cin>>n>>V;
for(int i = 1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i = 1;i<=n;i++){
for(int j = V;j>=0;j--){
dp[i][j] = dp[i-1][j];
if(j>=v[i]){
dp[i][j] = max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
}
}
}
cout<<dp[n][V]<<'\n';
memset(dp, -1, sizeof dp);
// for(int i = 1;i<=V;i++){
// dp[0][i] = -1;
// }
dp[0][0] = 0;
for(int i = 1;i<=n;i++){
for(int j = 0;j<=V;j++){
dp[i][j] = dp[i-1][j];
if(j>=v[i]&&dp[i-1][j-v[i]]!=-1){
dp[i][j] = max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
}
}
}
if(dp[n][V]==-1){
cout<<0<<'\n';
}
else{
cout<<dp[n][V];
}
return 0;
}
// 64 位输出请用 printf("%lld")
第一问和第二问稍微不同,第二问需要初始化,将背包容量为0的情况设置价值为0,其它情况设置为最小的Integer型整数,表示不可达状态。后续所有的状态都需要从为0的状态转移过去。状态转移方程为dp[i][j] = max(dp[i-1][j],dp[i][j-v[i]]+w[i]).



京公网安备 11010502036488号