揹包演算法 容差

2021-08-30 05:08:43 字數 1672 閱讀 6830

--續前面的部落格內容

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...