当前位置: 首页 > 知识库问答 >
问题:

0/1背包算法

狄宇
2023-03-14

我对这个问题有点困惑。作为算法帮助我找到最大的利润从袋。但是这个算法并没有告诉我我应该拿哪一个项目会让我的利润最大。例如
n=4项,背包的容量M=8,利润=[15,10,9,5],重量分别为w=[1,5,3,4],当我解决这个问题时,我得到最大的利润为29

这里是解决方案[http://www.mafy.lut.fi/study/DiscreteOpt/DYNKNAP.pdf]

但是我想知道我应该选哪一个项目才能赚29英镑。我不想做所有的组合,因为如果有n个项目,分别有n个权重和n个利润,那么会有多少组合。所以我想知道这个算法或其他算法有没有什么解决方案,可以给我利润总额最大的项目。请帮帮我。等待答复!非常感谢。

共有3个答案

隆璞
2023-03-14

0-1背包确实希望您称量所有可能的组合,因为与分数背包不同,分数背包中我们可以使用贪婪算法获得最大利润,空白空间会降低每磅(重量)负载的有效利润。在0-1背包中,当我们考虑是否在背包中包含一个项目时,我们必须将解决方案与包含问题的子问题进行比较,该子问题在我们做出选择之前排除了该项。

因此,解决方案运行O(nW),其中n是物品的数量,W是可以放入背包的物品的重量

希望它澄清!

史英睿
2023-03-14

如果您的问题仍然是“但我想知道我应该选择哪个项目”,那么下面是一个打印实际项目的实现:

import java.util.ArrayList;
import java.util.List;

public class Knapsack
{

    private int counter = 0;
    private int[] values, weights;
    public Knapsack(int[] vs, int[] ws)
    {
        values = vs;
        weights = ws;
    }

    public Bag knap(int n, int w)
    {
        counter++;
        Bag ret = new Bag();
        if (n == -1) {
            return ret;
        }

        ret = knap(n - 1, w);
        assert ret.totalWeight() <= w;
        if (weights[n] > w) {
            // This weight alone is larger than our quota. Can't add any more.
            return ret;
        }
        int val1 = ret.totalValue();
        int weight1 = ret.totalWeight();
        int remain = w - weight1;
        if (weights[n] <= remain)
        {
            // We have space for this item. Add to bag.
            ret.add(n, values[n], weights[n]);
            return ret;
        }
        int max = w - weights[n];
        ArrayList<Integer> nitems2 = new ArrayList<Integer>();
        Bag ret2 = knap(n - 1, w - weights[n]);
        ret2.add(n, values[n], weights[n]);
        int val2 = ret2.totalValue();
        int weight2 = ret2.totalWeight();
        if (val1 > val2) {
            return ret;
        } else {
            return ret2;
        }
    }

    public static void main(String[] args)
    {
        int[] values = {15, 10, 9, 5};
        int[] weights = {1, 5, 3, 4};
        int M = 8;

        Knapsack ks = new Knapsack(values, weights);
        Bag ret = ks.knap(values.length - 1, M);
        System.out.println("Total value=" + ret.totalValue() + ", weight=" +
                       ret.totalWeight());
        List<Integer> items = ret.bagItems();
        System.out.print("Items: ");
        for (int i: items) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}

class Bag {
    private int weight;
    private int value;
    private ArrayList<Integer> items;
    public Bag()
    {
        weight = 0;
        value = 0;
        items = new ArrayList<Integer>();
    }

    public void add(int itemno, int v, int w)
    {
        items.add(itemno);
        weight += w;
        value += v;
    }

    public int totalWeight() { return weight; }
    public int totalValue() { return value; }
    public List<Integer> bagItems() { return items; }
}
金理
2023-03-14

动态编程:

对于0/1背包,您可以拿走整个物品,也可以完全离开。因此,您必须计算所有可能的解决方案,然后才能决定哪一个是最好的。

贪心法

在另一个背包问题中,你可以拿走一小部分物品,你可以按照成本来做,也就是说,拿最高成本的物品,装满你的背包,直到你的背包满了或者没有更多的物品,然后继续拿第二高成本的物品等等...

 类似资料:
  • 我写了一个背包类,我用它来解决背包算法。这个类正在使用动态规划算法来解决这个问题。 我在代码中实现了一些优化,因此我使用线性O(W)空间来找到最大值,但当我试图找到见证时,我仍然需要O(nW)空间来保持布尔表。 有人能告诉我,是否有可能找到背包容量最大、空间较小、复杂度与O(nW)相同的证据,这里W是背包容量。 如果您认为代码中可能还有更多优化,请也告诉他们。

  • 本文向大家介绍C中的0-1背包问题?,包括了C中的0-1背包问题?的使用技巧和注意事项,需要的朋友参考一下 背包是袋子。背包问题是根据物品的值将物品放入袋中的。目的是使袋子内的值最大化。在0-1背包中,您既可以放置物品也可以将其丢弃,没有将物品的某些部分放入背包的概念。 样本问题 重量分布 最大值为65,因此我们将项目2和3放入背包。 0-1背包问题计划 输出结果

  • 在我为0/1背包和无界背包签出的所有DP解决方案中,解决方案方法总是这样定义的: 0/1背包:取第n项或不取第n项,使总价值最大化。例如,0/1背包 无界背包:将第n个物品视为最后挑选的物品,或(n-1)个物品视为最后挑选的物品,使总价值最大化。例如,无界背包 但无界背包也可以使用0/1背包的逻辑来解决,只需稍加调整。我的意思是,对于0/1背包,我们执行以下操作(使用第一个链接中的代码): 请注意

  • 我目前正在研究一个路由问题(找到一个我想去的地方的子集[每个地方有一定的分数],同时不超过最大的旅行时间),并提出了1/0背包问题的变体,似乎解决了我最初的问题。 根据维基百科,1/0背包被描述为: 给定一组物品,每个物品都有质量和价值,确定集合中每个物品的数量,以便总重量小于或等于给定的限制,总价值尽可能大。 因此,对于每个项目,都有一个固定的重量(质量),当试图解决问题时,可以很容易地使用它,

  • 我有这样的数据集: 长度:233333450560650780限制:5400 现在我的问题是,从设定的最高长度到最低长度中选择项目,以弥补限制或尽可能接近。 我知道背包和最小硬币兑换都能解决我的问题。我想知道哪个更好。 请注意,硬币变化是使用贪婪算法,背包使用动态编程

  • 我正在为即将到来的测试复习,想知道是否有人能重述问题的b部分。这是从分发的复习表中得到的文本,但我不确定b部分到底在问什么。我更直截了当地猜测“生成一个不到0/1背包问题最优值1%的解”是什么意思。 b)[10pts]举了一个有两个对象的例子,说明对分数背包问题使用的相同的贪婪方法(略加修改,如果贪婪方法选择的最后一个对象不适合,则忽略它)得到的解不到0/1背包问题最优解的1%。