zoukankan      html  css  js  c++  java
  • 算法笔记(c++)--关于01背包的滚动数组

                算法笔记(c++)--关于01背包的滚动数组


    关于01背包问题:基本方法我这篇写过了。

    https://www.cnblogs.com/DJC-BLOG/p/9416799.html

    但是这里数组是N^2,据说滚动数组可以用1维来代替二维。

    我想了想也没想通。干脆老方法,一步步列出来就懂了。

    先上下滚动数组的代码,然后分析代码:

    dp[N];//这里只用一维的
    for(int i=1; i<=n; i++)//对每个数判断,可反
     {
            for(int j=m; j>=weight[i]; j--)/
                dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
    }

     这里用到还是熟悉的数据熟悉的内容:

    体积 价值
    0 0
    4 8
    6 10
    2 6
    2 3
    5 7
    1 2

    然后开始循环,先说下代码里面的n是物品,m是背包容量:,真实的值是n=6,m=12

    1)

    最初i=1,j=16表示只有1号物品也就是(4-8),背包容量为16时候。这时候dp[12]=max(dp[12],dp[12-4(1号物品体积)+8(1号物品价值)])=8;

    这样一直到m[1][4]都是8,。当包容量小于此时1号物品容量时候跳出循环。这时候m[1][j]就是【0,0,0,8,8,8,8,8,8,8,8】

    2)

    这是第二次n循环,这时候i=2,包含了一号物品和二号物品,二号物品为6-10;此时包可以装下

    dp[12]=max(dp[12],dp[12-6]+10)=dp[12-6]为8所以这dp[12]=18.同理dp[10]dp[11]都是18。

    dp[9]-dp[6]时候   比如max(dp[9],dp[9-6]+10)=dp[3]为0所以最终为10。没问题的话最终【0,0,0,8,8,8,10,10,10,18,18】.

    3)到这里气候就差不多了,下面都是类似的。

    看起来没什么问题了。

    不用滚动数组的话代码这样

    这就是上一次的数值。滚动数组是把它保留了然后从后往前更新,直到背包容量小于物品容量的话更新就不用了,直接拿上一次就好了。

  • 相关阅读:
    OSVERSIONINFOEX structure
    VS系列开发工具发展概述
    VS2008与QT4.6集成
    windows nt service 框架
    Rair
    如何在进程之间共享内核对象
    GOOGLE
    如何获取错误消息说明使用 FormatMessage API
    EnableDebugPriv;
    汇编语言资料
  • 原文地址:https://www.cnblogs.com/DJC-BLOG/p/9417778.html
Copyright © 2011-2022 走看看