设有编号1、2、... 、n的n个物品,它们的重量分别为w1、w2、... 、wn,价值分别为v1、v2、... vn,其中wi、vi(1<=i<=n)均为正数。有一个背包可以携带的最大重量不超过W.求解目标是在不超过背包负重的前提下使背包装入的总价值最大(即效益最大化)。与0/1背包问题的区别是,这里的每一个物品可以取一部分装入背包。
对于下表所示问题示例
i | 1 | 2 | 3 | 4 | 5 |
wi | 10 | 20 | 30 | 40 | 50 |
vi | 20 | 30 | 66 | 40 | 60 |
vi/wi | 2.0 | 1.5 | 2.2 | 1.0 | 1.2 |
解法分析
每次从物品中选择单位重量下最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 51
using namespace std;
int n=5;
double W =100; //限重
struct NodeType
{
double w;
double v;
double p; //p&