--續前面的部落格內容
declare
type test_t is table of vw_money%rowtype index by binary_integer;
res test_t;
l_row binary_integer:=1;
sums number;
cal varchar2(1000);
seq varchar2(1000);
j number;
lv_result number;
lv_target number := 10; --- 目標
lv_diff number := 1; --- 允許誤差
lv_cal varchar2(1000);
lv_seq varchar2(1000);
begin
select *
bulk collect into res
from vw_money;
--dbms_output.put_line(res.count);
lv_result := null;
for i in res.first .. 2**res.last-1 loop
sums:=0;
seq:='';
cal:='';
j:=1;
while j<=res.count and res(j).pow<=i loop
if (bitand(i,res(j).pow) <> 0) then -- 2的冪事先算好了
sums:=sums+res(j).amount;
cal:=cal||res(j).amount||'+';
seq:=seq||res(j).id||',';
if sums - lv_target >= abs(lv_result - lv_target) or sums - lv_target>lv_diff then ---- 已經有更接近的答案或誤差超出範圍
exit;
end if;
end if;
j:=j+1;
end loop;
if abs(sums - lv_target)<=lv_diff and (lv_result is null or abs(sums - lv_target) < abs(lv_result - lv_target)) then
lv_result := sums;
lv_cal := cal;
lv_seq := seq;
end if;
if lv_result = lv_target then
exit;
end if;
end loop;
if lv_result is null then
dbms_output.put_line('不存在符合要求的答案');
else
lv_cal:=substr(lv_cal,1,length(lv_cal)-1);
lv_seq:=substr(lv_seq,1,length(lv_seq)-1);
dbms_output.put_line('結果是:'||lv_cal||'='||lv_result);
dbms_output.put_line('序列是:'||lv_seq);
end if;
end;
演算法筆記 揹包DP 分組揹包
1.分組揹包模板題目 有n組物品,每組有k種物品,每種物品有體積和價值,每組選乙個,不超過揹包體積v,求最大值。狀態轉移方程 f j max v i j 表示第i組物品第j種物品的體積,w含義一樣,表示價值 方程含義可以參考我之前的部落格,揹包dp 都有類似的解釋 來一組偽 for 列舉每一組 fo...
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
演算法 揹包問題
揹包問題用逆序減少空間複雜度的情況下,揹包問題,如果是多維揹包 質量,容積,個數 則加矩陣維度 如果是01揹包,則逆序內迴圈,如果是完全揹包 每種物品個數不限 則順序內迴圈,如果是混合揹包 限制每種物品的個數 include using namespace std define maxn 110 d...