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

    又见01背包

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
        有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

    思路:

    01背包新思路,当质量过大时,会出现内存过大,换个思路,由于100*100也就是总价值最大值为10000,所以令价值为V的背包放入的最少质量,此放入为完全背包,所以令背包初始化为MAX;
    代码:
     1 #include<stdio.h>
     2 struct goods{
     3  int w,v;
     4 }goods[110];
     5 #define MAX 1<<30
     6 int bag[10010];
     7 int main(){
     8  int W,n,V,value;
     9  while(~scanf("%d%d",&n,&W)){V=0;
    10  //printf("%d
    ",MAX);
    11   for(int i=0;i<n;++i)scanf("%d%d",&goods[i].w,&goods[i].v),V+=goods[i].v;
    12  for(int i=1;i<=V;++i)bag[i]=MAX;
    13  bag[0]=0;
    14  for(int i=0;i<n;++i){
    15   for(int j=V;j>=goods[i].v;j--){
    16    bag[j]=bag[j-goods[i].v]+goods[i].w<bag[j]?bag[j-goods[i].v]+goods[i].w:bag[j];
    17     
    18   }
    19  }
    20  for(int i=0;i<=V;++i)value=bag[i]<=W?i:value;
    21  printf("%d
    ",value);
    22  }
    23  return 0;
    24 }
  • 相关阅读:
    使用supervisor过程的坑
    为apache安装mod_wsgi的时候出现-fpic的问题
    信息生成二维码的方法
    mac下virtualbox安装win7系统
    js读取json方法
    如何读取抓取的wifi包内容
    python文章学习列表
    sqlserver中drop、truncate和delete语句的用法
    UE中使用正则表达式的一些技巧
    指定IE浏览器渲染方式
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4640805.html
Copyright © 2011-2022 走看看