zoukankan      html  css  js  c++  java
  • 01背包 和 完全背包 详解

    二维的就不用记了 二维的容易理解

    看看一的

    给一个在线生成的01背包的过程网址 http://karaffeltut.com/NEWKaraffeltutCom/Knapsack/knapsack.html(需FQ)

    一组测试数据
    背包容量 c =10
    物品数量 n=5
    每个物品的价值 v[]=5 4 3 2 1
    重量 w[]=1 2 3 4 5

    看代码:
    for(int i=1;i<=n;i++)
    for(int j=c;j>=w[i];j--)
    dp[j]=max(dp[j],dp[j-w[i]]+v[i])

    讲解:

    首先遍历所有的物品
    然后倒着查看当前容量下所能放置的最大价值(为什么倒着查看 稍后讲)
    比如当前物品的重量是3 先看容量为10的状态下 容量为10肯定可以放下重量为3 的物品 但是还余剩7的空间 7的空间总不能空这不用吧
    这时我就找容量为7的状态下所能放置的最大价值(注意: 此时7的最大价值是在放置上一个物品之后所计算呢的最大价值 如果正序查看容量的话,就会先查看容量为7的状态下 那么就会把他的值更新了(此时已经把重量为3的物品装进去了 当查看容量为10 的时候他会先把3放进去 然后放7的最大值 可是7的最大值已经把3放进去了相当于放进去两次重量为3 的物品了 同理 查看容量为7 的时候 容量为4 的时候就已经把3放进去了 这样一来 等查看完容量为10的时候已经把重量为3 的物品放进去了3次 ~~哈哈哈这就是完全背包啊))

    豁然开朗,,,,

    很容易写出完全背包
    or(int i=1;i<=n;i++)
    for(int j=w[i];j<=c;j++)
    dp[j]=max(dp[j],dp[j-w[i]]+v[i])

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    GUID
    Castle学习笔记二:框架结构及配置
    Linux编程基础
    Linux文件编程
    单臂路由配置实例
    CCNA学习笔记#02第7章操作与配置Cisco IOS
    Linux基本命令
    Linux系统中rar、unrar命令安装和使用详解
    批处理设置IP与DNS服务器
    Linux下载安装5笔输入法
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5421952.html
Copyright © 2011-2022 走看看