1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 const int max_n = 100+2; 8 const int max_W = 10000+2; 9 10 int n,W; 11 int dp[max_n][max_W]; 12 // 定义如下: 13 // dp[i][j]:从前i个物品中,选出重量不超过j的物品 14 // dp[0][j]=0 15 // d[i][j]=? 16 // if(j<w[i]) dp[i][j]=dp[i-1][j] 17 // else dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]] + v[i]) 18 int w[max_n],v[max_n]; 19 20 void solve() 21 { 22 memset(dp,-1,sizeof(dp)); 23 // dp[0][j] = 0 24 // 初始条件 25 for(int i=0;i<=n;++i) 26 { 27 dp[0][i]=0; 28 } 29 30 for(int i=1;i<=n;++i) 31 { 32 for(int j=0;j<=W;++j) 33 { 34 if(j<w[i]) 35 { 36 dp[i][j]=dp[i-1][j]; 37 } 38 else 39 { 40 // 貌似与0-1背包的区别,只在于这里了,将i-1改为i 41 // 当然,要了解实质 42 dp[i][j]=max( dp[i-1][j] , dp[i][j-w[i]] + v[i] ); 43 } 44 } 45 } 46 } 47 48 int main() 49 { 50 scanf("%d %d",&n,&W); 51 for(int i=1;i<=n;++i) 52 { 53 scanf("%d %d",&w[i],&v[i]); 54 } 55 solve(); 56 printf("%d ",dp[n][W]); 57 return 0; 58 } 59 60 /* 61 3 7 62 3 4 63 4 5 64 2 3 65 */