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
原创粉丝点击