zoukankan      html  css  js  c++  java
  • 一维数组解背包问题

      背包问题是已知一个背包的容量,一堆物体的重量和价格,问你怎么装东西价值会达到最大。

      用动态规划求解需用到二维数组sum[i][j],表示允许放前i个物体且背包重量为j时的最大价格。此时如果从前往后遍历需要用到二维数组,但每一次求下一个i对应的sum只需要知道前一个i就行了,如果从后往前扫则只需用到一维数组,因为被覆盖掉的部分不会再被使用,代码如下:

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 int sum_values[1005];
     5 int main()
     6 {
     7  int T;
     8  int N,V;
     9  int i,j;
    10  while(scanf("%d %d",&N,&V)&&(N+V))
    11  {
    12   int weight[1001],value[1001];
    13   for (i=1;i<=N;i++)
    14   {
    15    scanf("%d",&weight[i]);
    16    scanf("%d",&value[i]);
    17   }
    18   memset(sum_values,0,sizeof(sum_values));
    19   for (i=1;i<=N;i++)//从第一种水果开始一直到第N种水果
    20    for(j=V;j>=weight[i];j--)//从满的状态开始,且第j个状态容量应该要大于第i个种类的大小
    21     if (sum_values[j-weight[i]]+value[i]>sum_values[j])//如果第j个状态之前即第j-1个状态放入一个第i类的水果,并且放入后总价值大于第j个状态的价值,则第j-1个状态时选择放入
    22      sum_values[j] = sum_values[j-weight[i]]+value[i];
    23   printf("%d
    ",sum_values[V]);
    24  }
    25  return 0;
    26 }
    27 /* 0 1 2 3 4 5 6 7 8
    28    0 0 0 0 0 0 0 0 0
    29    0 0 0 0 0 10 10 10 10
    30    0 0 0 20 20 20 20 20 30
    31    0 0 0 20 20 20 20 25 30
    32    0 0 0 30 30 50 50 50 50
    33 编号 重量 价值
    34    1 5 10
    35    2 3 20
    36    3 4 5
    37    4 2 30*/
  • 相关阅读:
    linux常用命令
    BAT:如何用批处理清空某个文件的内容
    Java_Blog01:编程入门
    Azkaban的job从创建到执行
    Sqoop1的导入导出
    Java 知识点干货
    启动Eclipse时报错如何解决?
    如何搭建JDK环境和配置JDK环境变量
    Create OpenStack and Docker base image based on CentOS7-mini ISO
    docker-ce install on CentOS7-mini
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5353872.html
Copyright © 2011-2022 走看看