我在MATLAB上的背包算法似乎有问题。我有几个要添加到存储的文件,它们有一定的值。我希望在一定的容量限制下最大化总价值。 值为10,40,30,50。 尺寸为6,4,5,3。 容量是10。
当我运行代码时,我获得了最佳总值,但我无法指定哪些文件已添加到存储中。有没有办法做到这一点?我尝试将文件编号添加到数组中,但它不起作用。每次运行该函数时都会清空该数组。 我的代码如下:
function maxim=addfiles(v,w,cap,n)
maxim=0;
stored=[];
if (cap==0)||(n==0)
return
else
if w(n)>cap
maxim=addfiles(v,w,cap,n-1);
else
if addfiles(v,w,cap,n-1)<v(n)+addfiles(v,w,cap-w(n),n-1)
maxim=v(n)+addfiles(v,w,cap-w(n),n-1);
stored(n)=n;
else maxim=addfiles(v,w,cap,n-1);
end
end
end
我想从算法中得到的回报是: 最佳值:90 添加的文件:2,4
提前谢谢。
答案 0 :(得分:0)
我重写了你的代码,所以它将返回最大值和选择;不确定它是否比你习惯的更多MATLABish,但它做同样的事情,并且更好地评论:-D
%// Knapsack problem
%// v = values (non-negative, vector)
%// w = weights (positive, vector)
%// cap = available capacity (non-negative, scalar)
%// n = the remaining number of objects (non-negative, scalar)
%//
%// maxim = max accumulated value (non-negative, scalar)
%// stored = index of stored objects (integer, vector)
function [maxim, stored] = addfiles(v,w,cap,n)
%// End of recursion
if (cap==0)||(n==0)
maxim = 0;
stored = [];
return;
end;
%// Above capacity
if w(n) > cap
[maxim, stored] = addfiles(v,w,cap,n-1);
return;
end;
%// Alternatives 1/2
[maxim1, stored1] = addfiles(v,w,cap,n-1);
[maxim2, stored2] = addfiles(v,w,cap-w(n),n-1);
if maxim1 < v(n) + maxim2
%// Adding is good
maxim = v(n) + maxim2;
stored = [stored2, n];
else
%// Adding is bad
maxim = maxim1;
stored = stored1;
end;
end
保存在addfiles.m
,然后拨打:
[maxim,stored] = addfiles([10, 40, 30, 50], [6, 4, 5, 3], 10, 4)