Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态规划背包_C++_Algorithm_Knapsack Problem - Fatal编程技术网

C++ 动态规划背包

C++ 动态规划背包,c++,algorithm,knapsack-problem,C++,Algorithm,Knapsack Problem,使用动态规划求解背包问题有一种通用算法。但对于W=750000000,它不起作用,因为存在一个错误bad alloc。对于我的W值,有什么想法可以解决这个问题吗 int n=this->items.size(); std::vector<std::vector<uint64_t>> dps(this->W + 1, std::vector<uint64_t>(n + 1, 0)); for (int j = 1; j <= n; j++)

使用动态规划求解背包问题有一种通用算法。但对于W=750000000,它不起作用,因为存在一个错误bad alloc。对于我的W值,有什么想法可以解决这个问题吗

int n=this->items.size();
std::vector<std::vector<uint64_t>> dps(this->W + 1, std::vector<uint64_t>(n + 1, 0));
for (int j = 1; j <= n; j++)
    for (int k = 1; k <= this->W; k++) {
        if (this->items[j - 1]->wts <= k)
            dps[k][j] = std::max(dps[k][j - 1], dps[k - this->items[j - 1]->wts][j - 1] + this->items[j - 1]->cost);
        else
            dps[k][j] = dps[k][j - 1];
    }
int n=this->items.size();
std::vector dps(this->W+1,std::vector(n+1,0));
对于(int j=1;j项[j-1]->wts项[j-1]->wts][j-1]+此->项[j-1]->成本);
其他的
dps[k][j]=dps[k][j-1];
}

您不显示
n
,但即使我们假设它为1,也让我们看看您试图分配多少数据。因此,它将是:

W*64*2 // Here we don't consider overhead of the vector
结果是:

750000000*64*2 bits = ~11.1758Gb

我猜这比你的程序允许的空间要大。你需要采取一种新的方法。也许可以尝试将问题处理为多个块。考虑第一和第二半SePATTLY,然后交换。

< P>首先,你可以只用一个维度来解决背包问题。这会将内存从dp[W][n](n*W空间)减少到dp[W](W空间)。你可以看看这里:

但是,即使您只使用dp[W],您的W也非常高,并且可能内存太多。如果你的物品很大,你可以用一些方法来减少可能的重量。首先,认识到你不需要W的所有位置,只需要那些权重之和[i]存在的位置

例如:

W = 500
weights = [100, 200, 400]
您永远不会使用矩阵的位置dp[473],因为项目只能占据位置
p=[01100200300400500]
。很容易看出,此问题与以下情况相同:

W = 5
weights = [1,2,4]
另一个更复杂的例子:

W = 20
weights = [5, 7, 8]
使用与之前相同的方法,您不需要0到20之间的所有权重,因为项目只能占据最多个位置

p = [0, 5, 7, 5 + 7, 5 + 8, 7 + 8, 5 + 7 + 8]
p = [0, 5, 7, 12, 13, 15, 20]

,您可以将矩阵从dp[20]减少到dp[p的大小]=M[7]。

@George sorry,C++@FantasticMrFox done