我们能把背包问题转换成对数时间吗?

3j86kqsm  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(524)

如果我想要一个有保证的最优解,那么我能做的最好的就是一个n^(n-1)解,因为我必须评估每一个可能的组合。
如果我想找到一个类似于optional的好的解决方案,那么我认为在o(log(n))中有一些算法可以找到这样的解决方案。答案到底是什么?

osh3o9ms

osh3o9ms1#

就这样,这取决于,这取决于我,你,还有你的系统。这类问题的范围惊人地大,即它需要的数据存储容量。关于限制动态规划,挑战在于您修复的代码中不同子问题的数量。挑战总是那么高,没有时间限制。我将不得不在这种情况下优化它。例如,矩阵链的乘法应该属于这个组。
在某些情况下,我可能会使用矩阵或哈希表;这是因为两者都有时间进行o(1)查找。时间复杂度可以从o(2^n)指数时间增加到o(2^n)psuedo多项式时间复杂度(nxw)。这也意味着,如果ww是一个常数,或者在nn(我的背包幂)中有一个多项式,那么动态程序就是多项式时间。
但是我需要从psuedo多项式时间o(nxw)到对数时间复杂度o(logn)进行优化。例如,我用动态规划方法解决了一个背包问题,它在空间和时间上都采用多项式时间复杂性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在实际应用中需要很大的存储容量,并且容易随向量空间维数的增加而扩展。

相关问题