找到能带来最大利润的组合

时间:2018-02-17 14:25:49

标签: algorithm

假设我的表格看起来像这样:

ID |成本|利润

1 | 0.55 | 1.24

2 | 0.23 | 3.11

3 | 0.19 | 2.21

4 | 0.53 | 1.49

......等等。

如果我的预算有一定价值,我如何找到最大利润?即:找到最大利润,成本为1.12。如果从上表中,我应该从ID 2 + 3 + 4中取出物品以最大化我的利润。

我正在尝试从LP,操作研究中搜索一些东西,但我真的是盲目地谷歌搜索,我不知道我应该寻找什么关键词。请帮忙。

3 个答案:

答案 0 :(得分:1)

您需要的是0/1 Knapsack!我从你给出的例子中假设你需要整个项目,而不是项目的一小部分。否则去默认(分数)背包。

了解greedy version of solution & why it might fail,然后是针对此问题的分数背包动态编程风格的解决方案,然后是0/1背包!这就是你应该学会解决这个问题的方法。

如果您对此有任何其他要求,请告诉我。

答案 1 :(得分:0)

这是一个O(2n + sort)算法,在大多数情况下应该会产生好的结果

  1. 计算每个项目的产量(item.yield = item.profit / item.cost
  2. 按产量对项目进行排序(最高收益率)
  3. remaining_budget > 0
  4. 时迭代已排序的项目
  5. number_of_items = floor(remaining_budget / item.cost)购买item.id,从number_of_items * item.cost
  6. 中减去remaining_cost

    如果您是离散操作,它不会总是捕获所有边缘情况,例如假设您有budget = 100Acost = 51, yield = 1.5B cost = 50, yield = 1.4项,

    • 100 - 51 = 49 + 51 * 1.5 = 76.5 = 125
      一个A会产生25.5利润
    • 100 - 2 * 50 = 0 + 2 * 50 * 1.4 = 70 = 140
      两个B s导致40利润,
      即,由于更有效地使用整个预算,购买两个更差的更好的

    但是,如果您继续经营,它将开始提高绩效,因为预算不再是一个限制因素

    优化可能包括

    • 计算排序时的产量,减少整个数据结构的迭代次数
    • 删除排序步骤而不是"扔掉"当你迭代时,更糟糕的选择,这最终可能需要更长的时间才能完成
    • remaining_budget < minumum_unit_cost时结束迭代,例如如果有很多高/中等成本但没有/很少有低成本,你可以停止迭代

答案 2 :(得分:0)

这里我有一个结构数组选项代码,您可以为您的 3d 值数组修改。这里我使用了 struct 函数来运行这个程序。

struct item
{
    double w,p,u;
};

你可以使用

//Fractional Knapsack
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct item
{
    double w,p,u;
};
bool compare( item a, item b)
{
    return a.u>b.u;
}
int main()
{
    int n,w;
    item arry[100];
    cin>>n>>w;
    for(int i=0; i<n; i++)
    {
        cin>>arry[i].w>>arry[i].p;
        arry[i].u = arry[i].p/arry[i].w;
    }
    sort(&arry[0],&arry[n],compare);
    int p=0;
    for (int i=0; i<n; i++)
    {
        if(w>arry[i].w)
        {
            p=p+arry[i].p;
            w=w-arry[i].w;
        }
        else{
            p=p+w*arry[i].u;
            w=0;
        }
    }
    cout<<"Total Profit: "<<p<<endl;
}