【问题标题】:Trouble with indices索引问题
【发布时间】:2017-04-30 20:00:20
【问题描述】:

我正在编写一个最大值背包算法。它接收一个带有具有价值和成本的物品的背包对象。我声明了一个用于计算最大值的二维数组。对于基本情况,我将第零行值设置为 0,将第零列值设置为 0。当我在背包中抓取一个物品时遇到了麻烦,因为当我想抓取第零个物品时,我真的在抓取第一个物品在背包中,因此在二维数组中得到了错误的值。有人可以查看我的代码,看看我缺少什么吗?

public static double MaximumKnapsack(Knapsack knapsack) {
    int numItems = knapsack.getNumOfItems();
    int budget = (int) knapsack.getBudget();
    double[][] DP = new double[numItems+1][budget+1];

    boolean taken = false;
    for (int i = 0; i < numItems + 1; i++) {
        for (int b = 0; b < budget + 1; b++) {
            if (i == 0 || b == 0) {
                DP[i][b] = 0;
            }
            else
            {
                Item item = knapsack.getItem(i);
                if (item.getCost() > b) {
                    DP[i][b] = DP[i-1][b];
                }
                else
                {
                    DP[i][b] = Math.max(DP[i-1][b-(int) item.getCost()] + item.getValue(),
                                        DP[i-1][b]);
                    if (DP[i][b] == DP[i-1][b-(int) item.getCost()] + item.getValue() && item.getCost() != 0.0) {
                        taken = true;
                    }
                }
            }
        }
        taken = false;
    }
    return DP[numItems][budget];
}

【问题讨论】:

    标签: dynamic-programming knapsack-problem indices


    【解决方案1】:

    我认为问题出在

    Item item = knapsack.getItem(i);
    

    因为您的循环将从 i = 1 开始。您应该使用:

    Item item = knapsack.getItem(i-1);
    

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 2017-01-01
      • 2011-06-18
      • 2013-07-03
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多