完全背包的一维dp 容量从大到小
01背包的一维dp 容量从小到大
这样理解对吗
您好像说反了,完全背包是从小到大,01背包是从大到小。
可以参考我的文章:https://blog.csdn.net/write_1m_lines/article/details/126385779
关于背包问题,容量的大小对于不同的解法有不同的要求。
对于背包问题,数组容量大小指的是背包可以容纳的物品总重量。在动态规划中,我们通常使用一个数组来表示背包的容量,例如 dp[i] 表示背包容量为 i 时的最大价值。在一维 dp 中,数组的大小是背包的容量大小加上 1,因为 dp[0] 表示背包容量为 0 时的最大价值。
在完全背包问题中,每种物品都有无限个可用,因此每个物品可以选择多次。在一维 dp 中,我们可以将物品的循环放在容量的循环内部,容量的循环从大到小,这样可以保证每个物品只被计算一次。例如:
for (int i = 1; i <= n; i++) {
for (intj = V; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
}
在这个例子中,V 表示背包的容量大小,w[i] 和 v[i] 分别表示第 i 种物品的重量和价值。对于每个容量 j,我们从大到小遍历,以保证每个物品只被计算一次。
在 01 背包问题中,每种物品只有一个可用,因此每个物品只能选择一次。在一维 dp 中,我们可以将物品的循环放在容量的循环外部,容量的循环从小到大,这样可以保证每个物品只被计算一次。例如:
for (int i = 1; i <= n; i++) {
for (int j = V; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
}
在这个例子中,V 表示背包的容量大小,w[i] 和 v[i]分别表示第 i 种物品的重量和价值。对于每个物品 i,我们从容量 V 开始遍历,以保证每个物品只被计算一次。
先看题目
对于完全背包问题,使用一维动态规划求解时,应该按照容量从小到大遍历。因为使用一维数组的前i个位置表示当前容量为i时的最大价值,而按照容量从小到大遍历可以保证每个物品只被遍历一次,不会重复计算。而对于01背包问题,使用一维动态规划求解时应该按照容量从大到小遍历。因为01背包问题中每个物品只能被选一次,所以要保证先遍历到的物品不会对后遍历到的物品产生影响,因此要按照容量从大到小遍历,保证遍历后面的物品时前面的物品已经被排除。