我正在为背包问题编写一个FPTAS算法,并发现我需要为此实现动态编程。我已经找到了许多用于动态编程的资源(O(n * W),n - 项目数,W - 最大容量),但基于利润很少(O(n ^ 2 * C),n - 项目,C从一个项目获得最高利润)。
我在这里只发现了一个带伪代码的源代码(它是波兰语,但你可以看到从第7页开始的代码和函数): http://www.asdpb.republika.pl/wyk78.pdf
我的代码:
F = new int[items.Count + 1, (Pmax * items.Count) + 1];
int y;
int k;
int profit = 0;
for (k = 0; k < items.Count; k++)
{
for (y = 0; y < (Pmax * items.Count); y++)
{
if (y == 0 && k >= 1)
F[k, y] = 0;
else if (y >= 1 && k == 0)
F[k, y] = int.MaxValue;
else if (k >= 1 && y >= 1)
{
if (y - items[k].profit < 0)
F[k, y] = (int)Math.Min(F[k - 1, y], int.MaxValue);
else
F[k, y] = (int)Math.Min(F[k - 1, y], F[k - 1, y - items[k].profit] + items[k].weight);
}
}
}
y = 0;
do
{
y++;
for (k = 1; k < items.Count; k++)
{
if (y - items[k].profit < 0)
F[k, y] = F[k - 1, y];
else if (F[k - 1, y - items[k].profit] == int.MaxValue)
F[k, y] = F[k - 1, y];
else
F[k, y] = (int)Math.Min(F[k - 1, y], F[k - 1, y - items[k].profit] + items[k].weight);
if(F[items.Count,y] <= maxCapacity)
profit = y;
}
} while (y < Pmax * items.Count);
我正在使用之前链接的网站上的示例数据:
n = 3
profits = [2,3,1]
weights = [1,3,3]
capacity = 5
但它返回利润= 9并完全不同的表F. 我的代码出了什么问题?还有其他好的消息来源吗?
或者我可以实现PTAS算法,但我也找不到任何好的来源。