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\n",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

 

posted on 2020-02-04 11:12  带你AK,带你飞  阅读(434)  评论(0编辑  收藏  举报