1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 6 using namespace std; 7 8 const int max_n = 100 + 2; 9 const int max_w = 1e7 + 10; 10 const int max_v = 100 + 2; 11 const int max_W = 1e9 + 10; 12 13 // 让我们来研究一下数据范围 14 // 与上次谈论的背包问题的区别在于,价值的区间很小,而重量的区间变得很大 15 // 我们需要按价值来进行dp 16 // 递推关系如下: 17 // dp[i][j]: 从前i个物品中,选取价值总和(等于)j的物品,得到的(最小)重量大小 18 // 限制依然是重量的大小小于W 19 // dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+w[i]) 20 // dp[0][0]=0; 21 // dp[0][j]=INF 22 23 int n,W; 24 int w[max_n],v[max_n]; 25 int dp[max_n][max_n*max_v]; 26 27 void solve() 28 { 29 memset(dp,0x3f,sizeof(dp)); 30 dp[0][0]=0; 31 32 for(int i=1;i<=n;++i) 33 { 34 for(int j=0;j<=n*max_v;++j) 35 { 36 dp[i][j]=min( dp[i-1][j],dp[i-1][j-v[i]]+w[i] ); 37 } 38 } 39 40 int ans=0; 41 for(int j=0;j<=n*max_v;++j) 42 { 43 if(dp[n][j]<=W) 44 { 45 ans=j; 46 } 47 } 48 49 printf("%d ",ans); 50 } 51 52 int main() 53 { 54 scanf("%d %d",&n,&W); 55 for(int i=1;i<=n;++i) 56 { 57 scanf("%d %d",&w[i],&v[i]); 58 } 59 solve(); 60 return 0; 61 } 62 63 /* test 64 4 5 65 2 3 66 1 2 67 3 4 68 2 2 69 70 */ 71 // ans=7