Oracle PL/SQL实现盒子组合求和筛选容器最优适配方案
Oracle盒子最优适配组合PL/SQL实现方案
需求梳理
- 基础数据:3个盒子的ID、存储物品数量从自定义记录类型表中获取,示例数据为B101(5)、B102(5)、B103(4)
- 容器规则:已有固定存量2,总容量为15,所有组合必须包含已有存量
- 输出要求:筛选出总容量小于容器总容量的所有组合中,总容量最大的最优适配组合
实现代码
DECLARE -- 自定义盒子记录类型 TYPE box_rec IS RECORD ( box_id VARCHAR2(10), item_count NUMBER ); -- 自定义记录类型表 TYPE box_tab IS TABLE OF box_rec; -- 盒子数据初始化,可根据实际数据源替换 l_boxes box_tab := box_tab(); -- 容器固定参数 c_exist_count CONSTANT NUMBER := 2; c_total_cap CONSTANT NUMBER := 15; -- 遍历过程变量 l_current_sum NUMBER; l_current_comb VARCHAR2(200); -- 最优结果存储变量 l_max_sum NUMBER := 0; l_best_comb VARCHAR2(200); BEGIN -- 加载盒子数据,可替换为从业务表查询赋值逻辑 l_boxes.EXTEND(3); l_boxes(1).box_id := 'B101'; l_boxes(1).item_count := 5; l_boxes(2).box_id := 'B102'; l_boxes(2).item_count := 5; l_boxes(3).box_id := 'B103'; l_boxes(3).item_count := 4; -- 位运算遍历所有非空盒子组合:3个盒子对应二进制001~111,共7种组合 FOR i IN 1 .. POWER(2, l_boxes.COUNT) - 1 LOOP l_current_sum := 0; l_current_comb := ''; -- 逐位判断是否选中对应盒子 FOR j IN 1 .. l_boxes.COUNT LOOP IF BITAND(i, POWER(2, j - 1)) > 0 THEN l_current_sum := l_current_sum + l_boxes(j).item_count; l_current_comb := l_current_comb || l_boxes(j).box_id || '、'; END IF; END LOOP; -- 去掉组合ID末尾多余的顿号 l_current_comb := RTRIM(l_current_comb, '、'); -- 叠加已有存量后判断是否符合容量要求,且为当前最优 IF (l_current_sum + c_exist_count) < c_total_cap AND (l_current_sum + c_exist_count) > l_max_sum THEN l_max_sum := l_current_sum + c_exist_count; l_best_comb := l_current_comb; END IF; END LOOP; -- 输出最优结果 DBMS_OUTPUT.PUT_LINE('最优适配组合为:' || l_best_comb); DBMS_OUTPUT.PUT_LINE('组合总容量(含已有存量):' || l_max_sum); END; /
输出示例
最优适配组合为:B101、B102 组合总容量(含已有存量):12
逻辑说明
- 位运算遍历所有组合的方式可兼容不同数量的盒子场景,仅需修改盒子初始化部分的数据源即可
- 遍历过程中实时校验容量规则、更新最优解,无需额外存储中间结果,执行效率高
- 所有规则参数(已有存量、总容量)均定义为常量,便于后续调整修改
内容的提问来源于stack exchange,提问作者user16117341
相关产品推荐
相关产品推荐

