有10件物品,它们的重量分别是5,8,3,2,6,6,5,4,7,5,,它们的价值分别是2,4,7,7,3,6,3,5,4,6,现在给你个承重为30的背包,试用0-1背包、完全背包算法,分别计算如何让背包里装入的物品具有最大的价值总和?
0-1背包算法
clear all
clc
close all
v=[2,4,7,7,3,6,3,5,4,6];%物品价值
w=[5,8,3,2,6,6,5,4,7,5];%物品重量
m=zeros(10,31);%建立二维数组
for j=0:30
if j>=w(1)
m(1,j+1)=v(1);
end
end%初始化第一行,数组编码从1开始,因此下标要加1
for i=2:10
for j=1:30
if j>=w(i)%背包可以装下当前物体
m(i,j+1)=max(m(i-1,j+1),m(i-1,j-w(i)+1)+v(i));%1.不装 2.空出刚好可以放进去的容量
else
m(i,j+1)=m(i-1,j+1);%容量不够不能装
end
end
end
disp(m(10,31))
矩阵最后一个元素即为价值最大值
完全背包算法
clear all
clc
close all
v=[2,4,7,7,3,6,3,5,4,6];%物品价值
w=[5,8,3,2,6,6,5,4,7,5];%物品重量
m=zeros(10,31);%建立二维数组
for j=1:31
m(1,j)=floor(j/w(1))*v(1);
end %初始化第一行,数组编码从1开始,因此下标要加1
for i=2:10
for j=1:30
for k=1:floor(j/w(i))%最多可以取k个背包
m(i,j+1)=max(m(i,j+1),m(i-1,j-k*w(i)+1)+k*v(i));%1、不取,2、取k个i背包
end
end
end
disp(m(10,31))