--续前面的博客内容
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;
分享到:
相关推荐
背包算法通常与动态规划相结合,用于求解在有限容量的背包中,如何选择物品以最大化价值或重量。在这个场景中,"改进的java背包算法"显然是对原有版本的优化,解决了在处理大数据量时导致的`StackOverflowError`问题...
编程语言:C语言 编程软件:Microsoft Visul C++ 6 操作系统:Windows 8.1 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, ...通过编程,学习用0-1背包的动态规划和部分背包的贪婪算法解决以上问题。
n是物品数,c是背包的容 量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的 重量。 Output 将计算出的装入背包物品的最大价值和最优装入方案 Sample Input 5 10 6 3 5 4 6 2 2 6...
0-1背包问题是一种经典的组合优化问题,常用于算法设计与分析的学习中。在这个问题中,我们有n种物品,每种物品具有重量wi、体积bi和对应的值vi,还有一个背包,它的容量限制为c(重量)和d(体积)。目标是通过选择...
动态规划是解决复杂问题的有效工具,例如背包问题、最长公共子序列、矩阵链乘法、编辑距离、最短路径等。理解动态规划的状态转移方程和最优子结构是学习的重点。 四、搜索算法 深度优先搜索(DFS)和广度优先搜索...
《常用算法程序集》(C语言描述)第三版是由清华大学出版社出版的一本经典算法书籍,其主要内容涵盖了广泛的算法实现,全部以C语言为编写工具。这本书不仅包含了经典的算法,也结合了作者的实践经验与现代数值计算的...
数学算法不容忽视,包括数论(质因数分解、模运算、最大公约数和最小公倍数)、组合数学(排列组合、容斥原理、鸽巢原理)以及线性代数等,它们在解决加密、编码和组合优化问题时发挥着重要作用。字符串处理算法如...
- 动态规划是解决具有重叠子问题和最优子结构特征问题的有效方法,如斐波那契数列、背包问题、最长公共子序列等。 4. **贪心算法**: - 贪心算法在每一步选择中都采取在当前状态下最好或最优的选择,例如霍夫曼...
8. **数学算法**:包括数论(如最大公约数、最小公倍数)、组合数学(如排列组合、容斥原理)、概率论、矩阵运算等。这些数学工具在解决一些复杂问题时起到关键作用。 9. **回溯与剪枝**:在解决一些组合优化问题时...
3. 动态规划:动态规划是解决复杂问题的强大武器,模板中会包含常见问题的DP状态转移方程,如背包问题、最长公共子序列等。 4. 贪心算法:在一些问题中,局部最优解可以导致全局最优解,贪心策略能够快速找到解决...
4. **动态规划**:通过解决子问题来构建全局最优解,如斐波那契数列、背包问题、最长公共子序列等。 5. **数值计算**:包括线性代数运算(如矩阵乘法、求逆、特征值计算)、插值和拟合、数值积分、微积分等,这些在...
7. **数学应用**:涵盖组合数学、数论、图论中的数学原理,如容斥原理、鸽巢原理、欧几里得算法、模运算等。 8. **信息学竞赛策略**:介绍如何分析问题、设计算法、编写高效代码,以及如何在竞赛中管理时间,提高...
9. **组合数学与概率**:涵盖组合计数、递推关系、容斥原理等,以及在算法设计中的应用,例如计算排列组合数,解决概率问题。 10. **复杂度理论**:介绍了时间复杂度和空间复杂度的概念,以及P、NP、NPC等问题,对...
1. **基础算法**:如排序(快速排序、归并排序、堆排序等)、搜索(二分查找、广度优先搜索、深度优先搜索等)以及动态规划(背包问题、最长公共子序列等)。 2. **数据结构**:线性结构(数组、链表、栈、队列等)...
9. **组合数学与概率论**:算法设计中常常需要计算组合可能性,书中会介绍组合计数、容斥原理和概率分析等相关知识。 10. **复杂性理论**:包括时间复杂性和空间复杂性,P、NP类问题以及NP完全问题,这些都是理论...
由于零件的数量众多且存在多种容差等级,因此很难直接求解。通过蒙特卡罗算法可以在零件可行范围内随机选取标定值和容差值,通过大量模拟实验来找出最佳组合。 - **彩票策略优化**:针对彩票问题,需要评估不同方案...
4. **数学算法**:包括数论(模运算、同余方程、最大公约数与最小公倍数)、组合数学(排列组合、二项式系数、容斥原理)、矩阵计算等。这些问题在组合优化、数列求解等方面有广泛应用。 5. **字符串处理**:KMP...
8. **组合数学**:介绍了排列、组合、鸽巢原理、容斥原理等基础知识,这些在分析算法复杂度时经常用到。 9. **概率与随机化算法**:概率分析和随机化算法在现代算法设计中扮演着重要角色,如Monte Carlo和Las Vegas...
8. **数学基础**:如数论(最大公约数、最小公倍数、质因数分解)、组合数学(排列组合、鸽巢原理、容斥原理)等,这些都是解决算法问题的常用工具。 9. **递归与分治**:如快速排序、归并排序、汉诺塔问题等,是...
3. 容斥原理:在计算多个集合的并集中元素的个数时,为了避免重复计数,需要用到容斥原理。例如,A∪B∪C的元素个数为A的元素个数+B的元素个数+C的元素个数-同时在A和B中的元素个数-同时在A和C中的元素个数-同时在B...