`
郭清明
  • 浏览: 17649 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

背包算法+容差

阅读更多
--续前面的博客内容
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背包算法

    背包算法通常与动态规划相结合,用于求解在有限容量的背包中,如何选择物品以最大化价值或重量。在这个场景中,"改进的java背包算法"显然是对原有版本的优化,解决了在处理大数据量时导致的`StackOverflowError`问题...

    0-1背包动态规划&部分背包贪婪算法

    编程语言:C语言 编程软件:Microsoft Visul C++ 6 操作系统:Windows 8.1 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, ...通过编程,学习用0-1背包的动态规划和部分背包的贪婪算法解决以上问题。

    已知有n中物品和一个可容纳M质量的背包,每种物品i的质量为Wi,假定将物品i放入背包,可以得到Pi的效益,求使背包中物品总效益最大的背包方案。

    n是物品数,c是背包的容 量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的 重量。 Output 将计算出的装入背包物品的最大价值和最优装入方案 Sample Input 5 10 6 3 5 4 6 2 2 6...

    0-1背包问题

    0-1背包问题是一种经典的组合优化问题,常用于算法设计与分析的学习中。在这个问题中,我们有n种物品,每种物品具有重量wi、体积bi和对应的值vi,还有一个背包,它的容量限制为c(重量)和d(体积)。目标是通过选择...

    ACM算法题集 基础算法教案

    动态规划是解决复杂问题的有效工具,例如背包问题、最长公共子序列、矩阵链乘法、编辑距离、最短路径等。理解动态规划的状态转移方程和最优子结构是学习的重点。 四、搜索算法 深度优先搜索(DFS)和广度优先搜索...

    常用算法程序集(C语言描述)(第三版)清华大学

    《常用算法程序集》(C语言描述)第三版是由清华大学出版社出版的一本经典算法书籍,其主要内容涵盖了广泛的算法实现,全部以C语言为编写工具。这本书不仅包含了经典的算法,也结合了作者的实践经验与现代数值计算的...

    ACM超级经典算法大集合

    数学算法不容忽视,包括数论(质因数分解、模运算、最大公约数和最小公倍数)、组合数学(排列组合、容斥原理、鸽巢原理)以及线性代数等,它们在解决加密、编码和组合优化问题时发挥着重要作用。字符串处理算法如...

    ACM程序设计竞赛常用算法集

    - 动态规划是解决具有重叠子问题和最优子结构特征问题的有效方法,如斐波那契数列、背包问题、最长公共子序列等。 4. **贪心算法**: - 贪心算法在每一步选择中都采取在当前状态下最好或最优的选择,例如霍夫曼...

    ACM的主要算法大全

    8. **数学算法**:包括数论(如最大公约数、最小公倍数)、组合数学(如排列组合、容斥原理)、概率论、矩阵运算等。这些数学工具在解决一些复杂问题时起到关键作用。 9. **回溯与剪枝**:在解决一些组合优化问题时...

    mumei的算法竞赛模板全套.rar

    3. 动态规划:动态规划是解决复杂问题的强大武器,模板中会包含常见问题的DP状态转移方程,如背包问题、最长公共子序列等。 4. 贪心算法:在一些问题中,局部最优解可以导致全局最优解,贪心策略能够快速找到解决...

    常用数学算法大全

    4. **动态规划**:通过解决子问题来构建全局最优解,如斐波那契数列、背包问题、最长公共子序列等。 5. **数值计算**:包括线性代数运算(如矩阵乘法、求逆、特征值计算)、插值和拟合、数值积分、微积分等,这些在...

    算法艺术与信息学竞赛学习指导

    7. **数学应用**:涵盖组合数学、数论、图论中的数学原理,如容斥原理、鸽巢原理、欧几里得算法、模运算等。 8. **信息学竞赛策略**:介绍如何分析问题、设计算法、编写高效代码,以及如何在竞赛中管理时间,提高...

    算法导论电子书

    9. **组合数学与概率**:涵盖组合计数、递推关系、容斥原理等,以及在算法设计中的应用,例如计算排列组合数,解决概率问题。 10. **复杂度理论**:介绍了时间复杂度和空间复杂度的概念,以及P、NP、NPC等问题,对...

    浙江大学ACM算法模板

    1. **基础算法**:如排序(快速排序、归并排序、堆排序等)、搜索(二分查找、广度优先搜索、深度优先搜索等)以及动态规划(背包问题、最长公共子序列等)。 2. **数据结构**:线性结构(数组、链表、栈、队列等)...

    经典教程《算法导论》

    9. **组合数学与概率论**:算法设计中常常需要计算组合可能性,书中会介绍组合计数、容斥原理和概率分析等相关知识。 10. **复杂性理论**:包括时间复杂性和空间复杂性,P、NP类问题以及NP完全问题,这些都是理论...

    数学建模十大经典算法

    由于零件的数量众多且存在多种容差等级,因此很难直接求解。通过蒙特卡罗算法可以在零件可行范围内随机选取标定值和容差值,通过大量模拟实验来找出最佳组合。 - **彩票策略优化**:针对彩票问题,需要评估不同方案...

    hdu ACM代码 每种算法都有分类

    4. **数学算法**:包括数论(模运算、同余方程、最大公约数与最小公倍数)、组合数学(排列组合、二项式系数、容斥原理)、矩阵计算等。这些问题在组合优化、数列求解等方面有广泛应用。 5. **字符串处理**:KMP...

    算法导论影印版 第二版

    8. **组合数学**:介绍了排列、组合、鸽巢原理、容斥原理等基础知识,这些在分析算法复杂度时经常用到。 9. **概率与随机化算法**:概率分析和随机化算法在现代算法设计中扮演着重要角色,如Monte Carlo和Las Vegas...

    刘汝佳 算法竞赛入门经典 白皮书ppt

    8. **数学基础**:如数论(最大公约数、最小公倍数、质因数分解)、组合数学(排列组合、鸽巢原理、容斥原理)等,这些都是解决算法问题的常用工具。 9. **递归与分治**:如快速排序、归并排序、汉诺塔问题等,是...

    al.rar_al算法程序

    3. 容斥原理:在计算多个集合的并集中元素的个数时,为了避免重复计数,需要用到容斥原理。例如,A∪B∪C的元素个数为A的元素个数+B的元素个数+C的元素个数-同时在A和B中的元素个数-同时在A和C中的元素个数-同时在B...

Global site tag (gtag.js) - Google Analytics