0-1背包把数组压缩到一维后为何要倒序循环
来源:互联网 发布:宁夏网络教育 编辑:程序博客网 时间:2024/06/04 01:06
在去年学习0-1背包的时候,我就记住了它背包的套路,但是在0-1背包使用一维数组的时候,内部的循环是倒序的,假设背包容量为W,物体重量的数组为w[i],内部的循环是
for(int j = W; j >= w[i];--j)
当时一直不知道为什么,今天又在看0-1背包,写了两个循环对比看了一下
for(int j = w[i]; j <= W; ++j)for(int j = W; j >= w[i]; --j)突然就发现了一些东西,想明白为啥j从W开始循环了。
首先看j从w[i]开始的循环:
for(int j = w[i]; j <= W; ++j){ dp[j] = max(dp[j],dp[j-w[i]]+v[i]);}
在这个过程中,j一直在变大,所以在后续的计算中,j-w[i]可能就会和之前计算过的j相等,这样就会导致物品i被重复拿出,就会计算出错误的结果
再看j从W开始的循环:
for(int j = W; j >= w[i]; --j){ dp[j] = max(dp[j],dp[j-w[i]]+v[i]);}j是一直在变小的,j一直在变小,j-w[i]也就会一直跟着变小,因为是在同一个i的循环内,w[i]代表的质量肯定不会变化的,所以j-w[i]就不会和之前计算过的j重合,所以就可以每次只拿一件物品。
0 0
- 0-1背包把数组压缩到一维后为何要倒序循环
- 0-1背包:使用滚动数组时为何要逆序枚举
- 0-1背包和完全背包是如何从二维数组压缩到一维数组的
- 0-1背包使用滚动数组压缩空间
- js for循环倒序输出数组元素
- C# for循环倒序输出数组元素
- swift3.0 倒序for循环
- 0 1背包状态压缩
- 数组倒序 & 字符串倒序
- 无限循环遍历数组(正序|倒序)先加后减原则
- 如何不使用for循环实现数组倒序
- 数组倒序
- 使用递归函数,将一个整型数组倒序输出。(数组用了随机数,每次的数组都不同,只用了调用,遗憾没用递归。。可以把for循环换成递归)
- 0-1背包内循环逆序讲解
- 数组元素倒序
- 一维数组倒序
- 数组倒序的算法
- 数组倒序排列
- 快照复制使用
- jeecms导入myeclipse,启动tomcat报错Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskA
- Skipping Items in Foreach loop container
- mybatis用集合多层封装查询结果
- grid添加滚动条之viewConfig——autoFill、forceFit属性初了解
- 0-1背包把数组压缩到一维后为何要倒序循环
- 内核与文件系统
- hdoj 1102 Constructing Roads (prim)
- android studio安装遇见的问题
- HttpClient 使用get方式发送数据到服务器并下载服务器文件
- com.google.gson.stream.MalformedJsonException的解决办法
- 欢迎使用CSDN-markdown编辑器
- JVM堆内存设置原理
- 基于NX的研发产品设计管理平台实现(一)--概述及目录