--这个算法得以实现,主要得到 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 sums<lv_close) THEN
lv_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;
分享到:
相关推荐
6. **分治算法**:分治法将大问题拆分为小问题,分别解决后再合并结果。如快速排序、归并排序和Strassen矩阵乘法都是分治思想的应用。 7. **回溯算法**:回溯算法是一种试探性的解决问题的方法,当遇到障碍时,它会...
常见的算法类型包括排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、广度优先搜索、深度优先搜索)、图论(如最短路径算法Dijkstra、最小生成树Prim或Kruskal)、动态规划(如背包问题、最长公共子序列...
### DD牛的背包九讲:背包算法的深入讲解 #### 01背包 01背包问题是最基础也是最典型的背包问题之一。问题描述为:给定N种物品和一个容量为V的背包,每种物品都有一个重量c[i]和一个价值w[i]。问如何选择这些物品...
实验报告涉及两个经典算法问题,分别是背包问题和自然数拆分问题,这两个问题都是通过递归的方法来解决的。在Java编程环境下,我们先来看背包问题。 背包问题,也称为0/1背包问题,是一种经典的组合优化问题。给定...
否则,将物品进行拆分,将部分物品装进背包中。当背包剩余容量为0时,停止循环,返回最优总价值。 蛮力法 求0-1背包问题最优解。首先穷举物品的全部子集,设置一个记录最大价值的变量maxvalue,遍历所有子集,计算...
否则,将物品进行拆分,将部分物品装进背包中。当背包剩余容量为0时,停止循环,返回最优总价值。函数设计如下: ```python def Greedy_F(n,c): #贪心算法求解分数背包问题最优解 #n表示物品个数,c表示背包容量 ...
使用贪心算法解决多重背包问题(物体可拆分)的具体C++代码
每个物品只能选择0或1个,不能拆分,因此得名“01背包”。 **动态规划解法** 解决01背包问题的经典方法是使用动态规划。动态规划的核心思想是将原问题分解为子问题,通过构建一个二维数组dp来存储每个子问题的最优...
不过,在实际学习背包问题时,可以通过网络搜索和参考文献来获取更深入的资料和实例,例如《算法导论》、《数据结构与算法分析》以及各种在线算法教程等。 综合来看,背包问题是一个经典的算法问题,通过动态规划等...
本报告将对比和分析几种不同的算法设计策略,以解决0-1背包问题。 首先,我们需要理解算法复杂性分析的重要性。算法复杂性主要分为时间复杂性和空间复杂性,它们分别衡量了算法执行时间和所需内存。在评估算法效率...
4. **动态规划**:动态规划是一种用于求解最优化问题的方法,例如背包问题、最长公共子序列、矩阵链乘法等。它通过将问题分解成子问题,避免了重复计算,从而提高效率。 5. **贪心算法**:贪心算法在每一步选择最优...
- **背包问题**:0/1背包、完全背包、多重背包,求解能装入背包的最大价值。 - **最长公共子序列**:寻找两个序列中最长的不降序子序列。 4. **图论算法**: - **深度优先搜索(DFS)**:遍历或搜索树或图的一种...
动态规划解决算法0-1背包问题实验报告含源代码.doc 本实验报告旨在解决0-1背包问题,使用动态规划法和回溯法生成两个长字符串的最优化比对结果,并且掌握动态规划、贪心算法、回溯法、分支限界法的原理,并能够按其...
7. **动态规划**:通过构建状态转移方程解决最优化问题,如背包问题、最长公共子序列、矩阵链乘法等。动态规划通常用于处理有重叠子问题和最优子结构的问题。 8. **回溯法**:在解决问题时,若发现当前选择不能导致...
动态规划解决算法0/1背包问题实验报告 动态规划是指在数学和计算机科学中,通过拆分复杂问题,递归地解决问题的方法。它将问题分解成更小的子问题,然后解决这些子问题,从而解决原始问题。动态规划法广泛应用于...
一种常见方法是使用二进制拆分技术,将每种物品的两个费用进行拆分,再使用常规背包问题的解法求解。 **5.3 物品总个数的限制** 当问题中还额外限制了物品的总数时,可以在动态规划的过程中增加一个维度来记录已...
对于01背包问题,使用传统的01背包算法;对于完全背包问题,使用相应的优化算法。 **再加上多重背包**:当问题进一步包含多重背包问题时,可以将多重背包问题转化为01背包问题,然后将整个问题视为01背包问题和完全...
- 背包问题:0-1背包、完全背包和多重背包,求解如何在容量限制下使总价值最大化。 - 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最长递增子序列(LIS):找到数组中最长的递增子序列。 - 矩阵...