第一行输入两个整数
和
,分别表示物品数量与背包容量。
此后
行,第
行输入两个整数
,分别表示第
件物品的体积与价值。
输出两行:
第一行输出方案
的答案;
第二行输出方案
的答案(若无解输出
)。
3 5 2 10 4 5 1 4
14 9
在该组样例中:
选择第
、第
件物品即可获得最大价值
(未装满);
选择第
、第
件物品可使背包体积
恰好装满且价值最大,为
。
3 8 12 6 11 8 6 8
8 0
装第三个物品时总价值最大但是不满,装满背包无解。
要求
的时间复杂度,
空间复杂度。
clc
clear
n_v_org = input('', 's'); % 原始 输入
n_v_org = strsplit(n_v_org, ' '); % 拆分
n = str2double(n_v_org{1}); % 物体 个数
T = str2double(n_v_org{2}); % 背包 体积
prop_list = zeros(n, 2); % 物体 属性
for i = 1:n
i_prop_org = input('', 's');
i_prop_org = strsplit(i_prop_org, ' '); % 拆分
prop_list(i, 1) = str2double(i_prop_org{1}); % 1 物体 体积
prop_list(i, 2) = str2double(i_prop_org{2}); % 2 物体 价值
end
prop_list;
% n = 3; % 物体 个数
% T = 5; % 背包 体积
% prop_list = [2 10
% 4 5
% 1 4];
dp_max_value = zeros(1, T+1); % 价值 表
dp_max_weight_value = -inf(1, T+1); % 价值 表
dp_max_weight_value(1) = 0;
for i = 1:n % 物体 i
i_t = prop_list(i, 1); % i 物体 体积
i_v = prop_list(i, 2); % i 物体 价值
for t = T+1:-1:i_t+1 % 总 体积 t, 注意 小于 i 物体 体积 部分 不需要 计算, 加快 运行 效率
if dp_max_value(1, t) < dp_max_value(1, t - i_t) + i_v
dp_max_value(1, t) = dp_max_value(1, t - i_t) + i_v;
end
if dp_max_weight_value(1, t - i_t) > -1
if dp_max_weight_value(1, t) < dp_max_weight_value(1, t - i_t) + i_v
dp_max_weight_value(1, t) = dp_max_weight_value(1, t - i_t) + i_v;
end
end
% % 上方 代码 可以 加快 计算
% dp_max_value(1, t) = max([dp_max_value(1, t), dp_max_value(1, t - i_t) + i_v]);
% if dp_max_weight_value(1, t - i_t) > -1
% dp_max_weight_value(1, t) = max([dp_max_weight_value(1, t), dp_max_weight_value(1, t - i_t) + i_v]);
% end
end
end
fprintf('%d\n%d', max(dp_max_value), max([dp_max_weight_value(T+1), 0]))