|
穷尽法:利用11GR2的递归WITH子查询:
WITH t (id , total_w , total_v , nodes ) AS (
SELECT id,weight,val,'(id='||id||' w='||weight||' v='||val||')'
FROM pack
WHERE weight<=10 --- 假设限制为10
UNION ALL
SELECT p.id,p.weight + t.total_w,p.val + t.total_v,nodes||' (id='||p.id||' w='||p.weight||' v='||p.val||')'
FROM pack p,t t
WHERE t.id<p.id
AND p.weight + t.total_w<=10 --- 假设限制为10
)
SELECT nodes,total_v
FROM (SELECT * FROM t ORDER BY total_v DESC)
WHERE ROWNUM=1;
(id=1 w=2 v=6) (id=2 w=2 v=3) (id=5 w=4 v=6) 15
比起#14的PLSQL版本,这个SQL不能够及时甩掉明显不是最优的解。 |
|