Algorithm 我们能在DP中解决这种0-1多背包问题吗?

Algorithm 我们能在DP中解决这种0-1多背包问题吗?,algorithm,dynamic-programming,knapsack-problem,Algorithm,Dynamic Programming,Knapsack Problem,问题是:给定一组n个物品和一组m个背包,c[i]是背包i的容量,w[j]是物品j的重量,p[i][j]是将物品j放入背包i的利润,这意味着如果放置在不同的背包中,物品可能有不同的利润 我们必须找到最优的解决方案,使所选项目的总利润最大,并且所有所选项目必须放在同一个背包中。例如,如果有两个背包A和B,最终的解决方案不能是将一些物品放在A中,将一些物品放在B中。所有选定的物品必须放在A或B中。因此,这个问题与传统的0-1多背包问题有所不同 一种解决方案是将这个多背包问题分解成多个小的0-1背包问题

问题是:给定一组n个物品和一组m个背包,c[i]是背包i的容量,w[j]是物品j的重量,p[i][j]是将物品j放入背包i的利润,这意味着如果放置在不同的背包中,物品可能有不同的利润

我们必须找到最优的解决方案,使所选项目的总利润最大,并且所有所选项目必须放在同一个背包中。例如,如果有两个背包A和B,最终的解决方案不能是将一些物品放在A中,将一些物品放在B中。所有选定的物品必须放在A或B中。因此,这个问题与传统的0-1多背包问题有所不同

一种解决方案是将这个多背包问题分解成多个小的0-1背包问题。对于每个背包,我们可以使用动态规划来解决0-1背包问题,并找到该背包的最大利润。使用相同的算法遍历所有背包并选择最大利润,我们可以得到我们想要的解


我想知道,有没有更好的方法和更好的时间复杂度来解决这个问题?或任何动态规划方法,以避免遍历所有的背包?如果没有更好的方法,如何证明?

这显然是最好的方法,除非背包有一些有用的结构(例如,如果我们知道背包中的每一个物品都比背包背包1有相同或较低的值,背包2的容量与背包背包1的容量相同或更低,根本就不需要考虑背包2)。。最好的解决方案是使用DP为每个背包找到最佳利润,然后遍历所有背包?如何证明这是最好的还是不最好的?我走得有点太远了——只有在假设任何算法(例如标准DP)都是最好的情况下才有可能作为一个子例程来解决每个包含的背包实例是最好的;我不知道是否确实如此。证明草图:该算法的时间复杂度为O(sum_I(t_I)),其中T_i是使用最著名的算法求解第i个单独背包实例所需的时间。假设存在一个渐近更快的算法,时间为o(sum_i(T_i)):请注意,此相同的算法能够解决单个背包实例,在这种情况下,必须比解决足够大的单个背包实例的最著名算法更快。这显然是最好的可能,除非背包有一些有用的结构(例如,如果我们知道背包中的每一个物品都比背包背包1有相同或较低的值,背包2的容量与背包背包1的容量相同或更低,根本就不需要考虑背包2)。。最好的解决方案是使用DP为每个背包找到最佳利润,然后遍历所有背包?如何证明这是最好的还是不最好的?我走得有点太远了——只有在假设任何算法(例如标准DP)都是最好的情况下才有可能作为一个子例程来解决每个包含的背包实例是最好的;我不知道是否确实如此。证明草图:该算法的时间复杂度为O(sum_I(t_I)),其中T_i是使用最著名的算法求解第i个单独背包实例所需的时间。假设存在一个渐近更快的算法,时间为o(sum_i(T_i)):请注意,此同一算法能够求解单个背包实例,在这种情况下,它必然比求解足够大的单个背包实例的最著名算法要快。