第一行输入两个整数
和
,分别表示物品数量与背包容量。
此后
行,第
行输入两个整数
,分别表示第
件物品的体积与价值。
输出两行:
第一行输出方案
的答案;
第二行输出方案
的答案(若无解输出
)。
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]))