C# 背包FPTA与按利润动态规划

C# 背包FPTA与按利润动态规划,c#,algorithm,dynamic-programming,knapsack-problem,C#,Algorithm,Dynamic Programming,Knapsack Problem,我正在为背包问题编写一个FPTAS算法,并发现我需要为此实现动态规划。我已经找到了许多关于*W,n-项目数量,W-最大容量的按权重进行二元编程的资源,但是基于^2*C,n-项目数量,C的利润很少,一个项目的最高利润 我在这里只找到一个伪代码源代码,它是波兰语的,但您可以从第7页开始看到代码和函数: 我的代码: F = new int[items.Count + 1, (Pmax * items.Count) + 1]; int y; int k; int profit = 0; for (k

我正在为背包问题编写一个FPTAS算法,并发现我需要为此实现动态规划。我已经找到了许多关于*W,n-项目数量,W-最大容量的按权重进行二元编程的资源,但是基于^2*C,n-项目数量,C的利润很少,一个项目的最高利润

我在这里只找到一个伪代码源代码,它是波兰语的,但您可以从第7页开始看到代码和函数:

我的代码:

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);
但它返回的利润=9,与表F完全不同。 我的代码怎么了?还有其他的好消息来源吗


或者,我可以实现PTAS算法,但我也找不到任何好的来源。

你能解释一下这个问题吗,举一个你想要达到的目标的例子?如果我理解正确的话,是不是你有C笔钱和n个项目,每个项目都有相关的成本/重量和利润,你想买东西来最大化利润?我说的对吗?@sasha C是代码中所有项目Pmax的最高值,我需要创建列数=n*C,行数=n的表。表中的值是权重。例如,第2行和第3列显示了最多两个或更少的首项,利润等于3,因此如果不可能,则为无穷大int.MaxValue。这里的利润是值而不是值/权重请解释“F[a,b]”状态下值的语义以及a和b的范围。FPTA最有可能是通过首先使用精确算法,但通过适当四舍五入修改实例来实现的,具体取决于例如最大利润和项目数量。
n = 3
profits = [2,3,1]
weights = [1,3,3]
capacity = 5