C ++背包实现

时间:2016-11-21 22:20:11

标签: c++ knapsack-problem

我的背包算法有问题。说实话,我不知道出了什么问题。当我使用程序一次,所有工作都错了,但是当我在循环中使用我的程序(进行测试)时,我遇到了很多问题。

例如:
文件中的重量/ Val:100
最大背包容量:1000
第一次迭代:
最大利润:2597
由此产生的重量:994/1000
它很好,但现在是另一个迭代 第二次迭代:
最大利润:2538
产生的重量:1004/1000 < - 并且有我的问题,超过我的最大上限。
第3,第4个是okey,然后第5个是错的(1355/1000),依此类推。

我的功能可能出现问题:

    void intoKnapsack(int k, float actual_profit, float actual_weight)
{
    if (actual_weight + weight[k] <= cap)
    {
        tmp[k] = 1;
        if (k <= number_items)
            intoKnapsack(k + 1, actual_profit + value[k], actual_weight + weight[k]);
        if (((actual_profit + value[k]) > final_profit) && (k == number_items))
        {
            final_profit = actual_profit + value[k];
            final_weight = actual_weight + weight[k];
            for (j = 0; j <= k; j++)
                knap[j] = tmp[j];
        }
    }
    else if ((bound(actual_profit, actual_weight, k) >= final_profit))
    {
        tmp[k] = 0;
        if (k <= number_items)
            intoKnapsack(k + 1, actual_profit, actual_weight);
        if ((actual_profit > final_profit) && (k == number_items))
        {
            final_profit = actual_profit;
            final_weight = actual_weight;
            for (j = 0; j <= k; j++)
                knap[j] = tmp[j];
        }
    }
}

有人可以帮我解决问题吗?

1 个答案:

答案 0 :(得分:0)

好的,所以当我只准备一次相同的N(如上面的例子中的100)那么它工作正常,但是当我在循环中这样做时:

void algorytm::sort() {

    int a;
    int b;
    float c;
    for (i = 0; i < number_items; i++)
        factor[i] = (float) val[i] / (float) weight[i]; //to sort from best to worst
    for (i = 0; i < number_items - 1; i++) {
        for (j = i + 1; j < number_items; j++) {
            if (factor[i] < factor[j]) {
                c = factor[i];                            //
                factor[i] = factor[j];
                factor[j] = c;
                a = val[i];                                 //
                val[i] = val[j];
                val[j] = a;
                b = weight[i];                                    //
                weight[i] = weight[j];
                weight[j] = b;
            }
        }
    }
}

所以当我自己做例如写(50),然后在同一个程序写(51)等等它工作得很好,但是当我写(50),然后另一个写(50),然后我有错误的算法。
也许当我进行排序时,在清除Knapsack之前它在另一个循环中不起作用,但另一方面我首先需要进行排序。
有我的排序功能

create-react-app your-new-app-name