背包FPTAS和利润的动态编程

时间:2015-01-18 11:09:18

标签: c# algorithm dynamic-programming knapsack-problem

我正在为背包问题编写一个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算法,但我也找不到任何好的来源。

0 个答案:

没有答案