一、小数背包问题
小数背包问题与01背包问题的不同
小数背包问题 | 0 1背包问题 |
---|---|
物品可拆分 | 物品是个不可分的整体 |
背包一定被装满 | 背包可能有空余 |
贪心算法 | DP算法 |
小数背包问题的解决步骤:
一、预处理,把物品按照价值率进行从大到小的排列(希望先装价值率最高的)
二、选择第一个物品(价值率最大),记录装进的重量、价值,及剩余容量
三、循环放物品,直至背包剩余容量为0
思考:小数背包问题可以采用动态规划算法来解决吗?
代码实现:
在重写sort()的compare函数时 ,出错了
int compare(item a,item b){
return (a.vrate>b.vrate)?a.vrate:b.vrate;
}
这个的含义是返回a,b的vrate最大值 ,并非比较,所以正确的写法应该是:
int compare(item a,item b){
return a.vrate>b.vrate;
}
可以有很多种重载>的写法,这里先用了两种:
一、重写sort的compare参数
int compare(item a,item b){
return a.vrate>b.vrate;
}
二、在结构体中重写 >,由于sort默认是从小到大的,所以还需要修改sort的compare
struct item{
int v;//价值
int w;//重量
double vrate;//价值率v/w
bool operator >( const item &s) {
return vrate>s.vrate; }