我们可以将背包问题转换为对数时间吗?

Can we convert a Knapsack problem to Logarithmic time?

如果我想要一个有保证的最佳解决方案,那么我能做的最好的就是 N^(N-1) 个解决方案,因为我必须评估每个可能的组合。

如果我想找到一个类似于optional的好的解决方案,那么我认为在O(log(N))中有算法可以找到这样的解决方案。答案究竟是什么?

就是这样,这取决于,这取决于我、你和你的系统。这类问题的范围大得惊人,也就是它所需要的数据存储容量。关于限制动态规划,挑战在于您修复的代码中不同子问题的数量。挑战总是如此之高,以至于没有时间限制。我将不得不在这种情况下优化它。例如,Matrix 链的乘法应该属于该组。

不过,在某些情况下,我可能会使用矩阵或散列 table;这是因为两者都有时间进行 O(1) 查找。时间复杂度可以从 O(2^n) 指数时间增加到 O(2^n) 伪多项式时间复杂度 (N x W)。这也意味着如果WW是一个常数,或者以NN中的多项式为界,我的背包幂,动态程序是多项式时间。

但我需要将其从伪多项式时间 O(N x W) 优化到对数时间复杂度 O(log n)。例如,我用动态规划方法解决了一个背包问题,该方法在 space 和 time:

中均采用多项式时间复杂度 O(N x W)
class Knapsack { 
  
    static int max(int a, int b)  
    { return (a > b) ? a : b; } 
  
    static int knapSack(int W, int wt[], int val[], int n) 
    { 
        int i, w; 
        int K[][] = new int[n + 1][W + 1]; 
  
        for (i = 0; i<= n; i++) { 
            for (w = 0; w<= W; w++) { 
                if (i == 0 || w == 0) 
                    K[i][w] = 0; 
                else if (wt[i - 1]<= w) 
                    K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]); 
                else
                    K[i][w] = K[i - 1][w]; 
            } 
        } 
  
        return K[n][W]; 
    } 
  
    public static void main(String args[]) 
    { 
        int val[] = new int[] { 60, 100, 120 }; 
        int wt[] = new int[] { 10, 20, 30 }; 
        int W = 50; 
        int n = val.length; 
        System.out.println(knapSack(W, wt, val, n)); 
    } 
} 

但是DP在实际的限制下需要很大的存储容量,而且也很容易用向量space维度进行扩展。