假设我的表格看起来像这样:
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,操作研究中搜索一些东西,但我真的是盲目地谷歌搜索,我不知道我应该寻找什么关键词。请帮忙。
答案 0 :(得分:1)
您需要的是0/1 Knapsack!我从你给出的例子中假设你需要整个项目,而不是项目的一小部分。否则去默认(分数)背包。
了解greedy version of solution & why it might fail,然后是针对此问题的分数背包动态编程风格的解决方案,然后是0/1背包!这就是你应该学会解决这个问题的方法。
如果您对此有任何其他要求,请告诉我。
答案 1 :(得分:0)
这是一个O(2n + sort)
算法,在大多数情况下应该会产生好的结果
item.yield = item.profit / item.cost
)remaining_budget > 0
number_of_items = floor(remaining_budget / item.cost)
购买item.id
,从number_of_items * item.cost
remaining_cost
醇>
如果您是离散操作,它不会总是捕获所有边缘情况,例如假设您有budget = 100
,A
项cost = 51, yield = 1.5
和B
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;
}