题目:
matlab代码:
报错:
能让代码运行就行,能完善就更好了
根据报错信息,可以看出是在第14行的语句中出现了问题,可能的原因是变量名错误或者数组下标越界。
可以将第14行的语句改为:
dp(i,j) = max(dp(i-1,j), dp(i-1,j-w(i))+v(i));
同时需要将第7行的变量名改为w和v,因为在第14行中使用了这两个变量。
完整的代码如下:
n = 4;
c = 8;
w = [2 3 4 5];
v = [3 4 5 6];
dp = zeros(n+1,c+1);
for i=1:n
for j=1:c
if j<w(i)
dp(i,j) = dp(i-1,j);
else
dp(i,j) = max(dp(i-1,j), dp(i-1,j-w(i))+v(i));
end
end
end
result = dp(n+1,c+1);
disp(result);
基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)
% 物品数据
w = [3, 1, 4, 2.5, 5, 1, 19, 6, 21];
v = [300, 45, 180, 188, 298, 30, 15, 9, 10];
c = [100, 45, 45, 40, 40, 30, 15, 15, 5];
n = length(w);
% 背包容量
W = 30;
% 初始化动态规划矩阵
dp = zeros(n+1, W+1);
% 逐步填充矩阵
for i = 1:n
for j = 1:W
if j >= w(i)
dp(i+1,j) = max(dp(i,j), dp(i, j-w(i))+v(i));
else
dp(i+1,j) = dp(i,j);
end
end
end
% 记录最优解的选择情况
x = zeros(n, 1);
j = W;
for i = n:-1:1
if dp(i+1,j) > dp(i,j)
x(i) = 1;
j = j - w(i);
end
end
% 输出结果
fprintf("物品\t重量\t价值\t选择\n");
for i = 1:n
fprintf('%d\t%.1f\t%d\t%d\n', i, w(i), v(i), x(i));
end
fprintf('总重量:%g kg\n', sum(x.*w));
fprintf('总价值:%d\n', dp(n+1,W));