#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]).