以下两个算法均是为了解决我前篇博客上的那个问题的高级方法
但效率有待进一步提高
create table t_money(id int primary key,amount int not null);
insert into t_money values(1,2);
insert into t_money values(2,2);
insert into t_money values(3,3);
insert into t_money values(4,5);
insert into t_money values(5,2);
insert into t_money values(6,8);
insert into t_money values(7,1);
insert into t_money values(8,2);
insert into t_money values(9,2);
insert into t_money values(10,3);
select * from t_money;
+----+--------+
| id | amount |
+----+--------+
1 2
2 2
3 3
4 5
5 2
6 8
7 1
8 2
9 2
10 3
--按位运算
declare
type test_t is table of t_money%rowtype index by binary_integer;
res test_t;
l_row binary_integer:=1;
sums number;
cal varchar2(1000);
seq varchar2(1000);
begin
SELECT *
BULK COLLECT INTO res
FROM t_money;
--dbms_output.put_line(res.count);
for i in res.first .. 2**res.last-1 loop
sums:=0;
seq:='';
cal:='';
for j in res.first .. i loop -- 不会比i更大
if (bitand(i,2**(j-1)) <> 0) then -- 如果不改为j-1, 当总额为31(全选)时解不出来
sums:=sums+res(j).amount;
cal:=cal||res(j).amount||'+';
seq:=seq||res(j).id||',';
IF SUMS >= 10 THEN ---- 尽早退出
EXIT;
END IF;
end if;
end loop;
if (sums=10) then
cal:=substr(cal,1,length(cal)-1);
seq:=substr(seq,1,length(seq)-1);
dbms_output.put_line('结果是:'||cal||'='||sums);
dbms_output.put_line('序列是:'||seq);
exit;
end if;
end loop;
end;
--分支
select path
from (select rownum rn,
hierarchy.sys_connect_by_path(level, id, ',') path,
hierarchy.sys_sum_by_path(level, amount) amount
from t_money
connect by id > prior id
AND hierarchy.sys_sum_by_path(level, amount)<=10 --- 中途裁剪
)
where amount = 10;
----
create or replace package hierarchy is
type strtabletype1 is table of varchar2(4000) index by binary_integer;
type strtabletype is table of strtabletype1 index by binary_integer;
strtable strtabletype;
type numtabletype1 is table of number index by binary_integer;
type numtabletype is table of numtabletype1 index by binary_integer;
numtable numtabletype;
function sys_connect_by_path(p_level in number,
p_value in varchar2,
p_delimiter in varchar2 default ',',
p_index IN NUMBER DEFAULT 1)
return varchar2;
function sys_sum_by_path(p_level in number, p_value in number,p_index IN NUMBER DEFAULT 1)
return number;
pragma restrict_references(sys_connect_by_path, wnds);
pragma restrict_references(sys_sum_by_path, wnds);
end;
---
create or replace package body hierarchy is
ls_ret varchar2(4000);
ln_ret number;
function sys_connect_by_path(p_level in number,
p_value in varchar2,
p_delimiter in varchar2 default ',',
p_index IN NUMBER DEFAULT 1)
return varchar2 is
begin
strtable(p_index)(p_level) := p_value;
ls_ret := p_value;
for i in reverse 1 .. p_level - 1 loop
ls_ret := strtable(p_index)(i) || p_delimiter || ls_ret;
end loop;
return ls_ret;
end;
function sys_sum_by_path(p_level in number, p_value in number,p_index IN NUMBER DEFAULT 1)
return number is
begin
numtable(p_index)(p_level) := p_value;
ln_ret := p_value;
for i in reverse 1 .. p_level - 1 loop
ln_ret := numtable(p_index)(i) + ln_ret;
end loop;
return ln_ret;
end;
end;
分享到:
相关推荐
原先在网上找到某位大虾写的一个简单的背包算法,于是在其基础上改成适合我们目前项目中要求的背包算法。此算法要求传入一组对象集合(其中的对象中只包含主键和值)和某个条件值,然后能打印sum(对象.值)条件的1个...
基于0-1背包算法的社交网络行为隐写术 本文提出了一种基于0-1背包算法的社交网络行为隐写术,以解决传统隐写术的安全性问题。该方法通过引入0-1背包人员分配协议,降低了发送者和接收者有较多的共同好友这一限制...
**背包算法详解** 在计算机科学和算法设计中,背包问题是一种经典的优化问题,它源于组合优化和图论领域。背包问题通常与资源分配、决策分析和最优化策略相关,广泛应用于项目管理、库存控制、软件工程等多个领域。...
背包算法 背包算法JAVA实现 背包算法JAVA实现
Java背包算法规划求解是一种经典的优化问题,常用于解决资源有限条件下的最大化效益问题。在给定的场景中,我们有n种商品,每种商品只有一个,并且有200块钱去购物,目标是使购买的商品总价值最大。这个问题可以抽象...
【标题】"pack.rar_背包_背包算法_背包算法 MATLAB_背包算法MATLAB" 提供了一个关于使用MATLAB实现背包问题算法的详细资料。背包问题是一个经典的优化问题,广泛应用于资源分配、决策制定等领域。在这里,我们将深入...
三、价值背包算法 在本项目中,我们特别关注价值背包问题,即每个物品的价值和重量不等。在选择物品时,不仅考虑其重量,还要考虑其对整体价值的贡献。通过遗传算法,我们能够平衡重量限制与价值最大化的关系,找到...
C++编写的背包算法程序 cpp 动态规划
0-1背包算法的目的是在不超过背包总承重的情况下,选择物品以最大化总价值。 本文将详细介绍0-1背包问题的解决方案,并提供C++代码实现,以便读者理解并运行验证。 首先,我们需要定义物品的基本结构,包括其重量...
综合以上信息,我们可以了解到这是一套用C++编写的密码学程序,实现了背包算法,可能是为了加密或解密目的。要深入理解这个算法的工作原理和用途,我们需要查看`baglock.cpp`源代码,并结合密码学理论来分析其加密...
在IT领域,背包问题是一种经典的优化问题,常用于解决资源有限条件下的决策优化。这个问题源自于实际生活中的各种场景,...对于学生和爱好者而言,深入理解并熟练应用背包算法,无疑会增强他们在信息技术领域的竞争力。
用 PHP 实现的 01 背包算法,参考了网上的相关 C++ 算法,用来方便 PHP 程序员改造使用,我是用它来实现在指定宽度的栏中整齐的排列一堆标签云,效果非凡且神奇,初次使用时一瞬间的确有这样的感觉。
### 背包算法经典:深入解析背包九讲 #### 第一讲:01背包问题 **知识点概览**:01背包问题是最基础的背包问题类型,涉及到的每种物品仅有一件,且每件物品只能选择放入背包或不放入背包。此问题通过动态规划方法...
C++实现回溯算法 0 1 背包算法 本文将详细介绍 C++ 实现回溯算法 0 1 背包算法的知识点。 首先,需要了解背包问题的定义。背包问题是指在有限容量的背包中,如何选择物品以达到最大价值的优化问题。在这里,我们...
它描述的是这样的场景:我们有一组物品,每种物品都有一个重量和价值,我们需要选择一部分物品放入一个容量有限的背包中,使得放入背包的物品总重量不超过背包的容量,同时使这些物品的总价值最大。0-1背包问题的...
0-1背包问题和部分背包问题是运筹学和计算机科学中的经典优化问题,它们在资源分配、任务调度、投资决策等多个领域有广泛应用。本实验主要关注这两种问题的算法实现,特别是动态规划和贪心策略。 0-1背包问题源于一...
0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。...在实际编程中,可以使用Python、Java等编程语言实现这个算法,并通过输入不同的物品和背包承重,测试算法的正确性和效率。
【C++代码背包算法】 在计算机科学中,背包问题(Knapsack Problem)是一类经典的组合优化问题。它源于实际生活中的物品装箱问题,旨在确定如何选择物品以最大化价值,同时不超过容器(背包)的最大容量限制。背包...
输入物品数量n,报的容量m,每个物品的体积,每个物品的价值 输入:最大价值
01背包问题算法 动态规划 代码 01背包问题算法 动态规划 代码 01背包问题算法 动态规划 代码