揹包演算法 拆分

2021-08-30 05:08:43 字數 2193 閱讀 7258

--這個演算法得以實現,主要得到 newkid 和 nyfor 兩位大哥的幫助

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);

lv_close number;

begin

select *

bulk collect into res

from vw_money;

--dbms_output.put_line(res.count);

lv_result := null;

lv_close := 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;

elsif lv_result is null and sums - lv_target>lv_diff and (lv_close is null or sumslv_close := 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

if lv_close is null then

dbms_output.put_line('不存在符合要求的答案');

else

lv_cal:=substr(lv_cal,1,length(lv_cal)-1)||'-'||(lv_close-lv_target);

lv_seq:=substr(lv_seq,1,length(lv_seq)-1);

dbms_output.put_line('結果是:'||lv_cal||'='||lv_target);

dbms_output.put_line('序列是:'||lv_seq);

end if;

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;

揹包問題 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。示例 示例 1 輸入 s leetcode worddict leet code 輸出 true 解釋 返回 true 因為 leetcode 可以被拆分成 leet co...

1353 揹包問題(貪心 可拆分)

題目描述 現在有很多物品 它們是可以分割的 我們知道它們每個物品的單位重量的價值v和重量w 1 v,w 100 如果給你乙個揹包它能容納的重量為m 10 m 200 你所要做的就是把物品裝到揹包裡,使揹包裡的物品的價值總和最大。輸入第一行輸入乙個正整數n 1 n 5 表示有n組測試資料 隨後有n測試...

0 1揹包問題(不可拆分問題)

假期 2020.01 180 1揹包問題是乙個經典的np hard組合優化問題,現實生活中的很多問題都可以以它為模型。本博文從動態規劃的角度進行問題的分析,分析了0 1揹包問題的數學模型,刻劃了最優解的結構特徵,建立了求最優值的遞迴關係式。0 1揹包問題一般描述為 給定n種物品和乙個揹包。物品i的重...