与01背包不同的是,
背包容量C、物品体积V、物品价值S
是正实数,不是正整数;
且允许每种物品的一部分装入背包
求总价值最大:
物品
u
1
,
u
2
,
u
3
u_1,u_2,u_3
u1,u2,u3
体积
18
,
15
,
10
18,15,10
18,15,10
价值
25
,
24
,
15
25,24,15
25,24,15
将物品的性价比进行排序,性价比 = 价值 / 体积
性价比: u 2 = 1.6 , u 3 = 1.5 , u 1 = 1.38 u_2 = 1.6,u_3 = 1.5,u_1 = 1.38 u2=1.6,u3=1.5,u1=1.38
按照单位体积从大到小的顺序选择物品装入背包
伪代码!!!
具体问题具体分析!!!
bool cmp(int a, int b)
{
return b > a;
}
int fun(int v[], int s[], int n, int C)
{
int y[n+1];
for(int i=1; i<=n; i++) // 求出性价比
y[i] = v[i]/s[i];
sort(y+1, y+1+n, cmp); // 性价比从大到小排序
int c = C;
int i = 1;
int M = 0; //记录最大价值
while(c>0 && i<=n)
{
if(y[i] <= rc) x[j]=1,rc-=s[i];
else x[j] = rc/s[j],rc=0;
M += v[j]*x[j];
}
return x,maxn;
}