zoukankan      html  css  js  c++  java
  • NYOJ 860 又见01背包

     有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 
    的物品,求所有挑选方案中物品价值总和的最大值。
      1 <= n <=100
      1 <= wi <= 10^7
      1 <= vi <= 100
      1 <= W <= 10^9
    输入
    多组测试数据。
    每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
    输出
    满足题意的最大价值,每组测试数据占一行。
    样例输入
    4 5
    2 3
    1 2
    3 4
    2 2
    样例输出
    7
    思路:由于重量太大不可能开重量的数组,所以我们可以这样考虑,求当前价值下的最小重量,这样的话问题就简单解决了;
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 const int MAX = 0x3fffffff;
     7 const int N = 1e4+10;
     8 struct T
     9 {
    10     int wi,vi;
    11 }ma[110];
    12 long long dp[N];
    13 int main()
    14 {
    15     int n , W, M;
    16     while(scanf("%d %d",&n,&W) !=EOF)
    17     {
    18         M = 0;
    19        fill(dp,dp+N,MAX);
    20         for(int i = 1;i<=n ; i++)
    21         {
    22             scanf("%d%d",&ma[i].wi,&ma[i].vi);
    23             M = ma[i].vi + M;
    24         }
    25         dp[0] = 0;
    26         //常用的01背包
    27        for(int i = 1; i<=n; i++)
    28           for(int j = M; j>=ma[i].vi; j--)
    29           {
    30             dp[j] = min(dp[j],dp[j-ma[i].vi]+ma[i].wi);
    31           }
    32           int ans = 0;
    33           for(int i = M; i>=0; i--)
    34           {
    35               if(dp[i]<=W) {ans = i;break;}//从最大的价值开始遍历,最大价值不会超过1w
    36           }
    37           printf("%d
    ",ans);
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    vue-常用指令汇总
    vue-插槽和具名插槽
    vue-传值校验
    vue-动态组件
    vue-组件
    zend studio 快捷键收集
    php调试工具firephp
    zend studio插件
    MySQL各个版本区别
    PHP 中 Date 函数与实际时间相差8小时的解决方法
  • 原文地址:https://www.cnblogs.com/lovychen/p/4424016.html
Copyright © 2011-2022 走看看