zoukankan      html  css  js  c++  java
  • 01背包问题---重量范围增大

     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
  • 相关阅读:
    OCP-1Z0-052-V8.02-28题
    OCP-1Z0-052-V8.02-27题
    OCP-1Z0-052-V8.02-26题
    OCP-1Z0-052-V8.02-25题
    Oracle DB 管理还原数据
    Flex中常见的图
    OCP-1Z0-052-V8.02-23题
    OCP-1Z0-052-V8.02-21题
    OCP-1Z0-052-V8.02-20题
    OCP-1Z0-052-V8.02-19题
  • 原文地址:https://www.cnblogs.com/jishuren/p/12258680.html
Copyright © 2011-2022 走看看