问题描述
有3个物品,其重量分别是{20, 30, 10},价值分别为{60, 120, 50},背包的容量为50,应用三种贪心策略装入背包的物品和获得的价值如图所示,至少有三种看似合理的贪心策略,,选一种贪心策略计算可以装入背包的物品的最大价值。
(1)选择价值最大的物品,因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。
(2)选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗得慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。
(3)选择单位重量价值最大的物品,在背包价值增长和背包容量消耗两者之间寻找平衡。
求解思路
设xi表示物品i装入背包的情况,根据问题的要求,有如下约束条件和目标函数:
应用第三种贪心策略,每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量,然后我们就面临了一个最优子问题——它同样是背包问题,只不过背包容量减少了,物品集合减少了。因此背包问题具有最优子结构性质。
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
struct tanxinbeibao
{
int id;
int weight;
int value;
double ratio;
};
bool Itemcmp(tanxinbeibao item1, tanxinbeibao item2){
return item1.ratio > item2.ratio;
}
int tanxinn;
int tanxinc;
double KnapSa