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