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

背包算法+拆分

阅读更多
--这个算法得以实现,主要得到 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. **回溯算法**:回溯算法是一种试探性的解决问题的方法,当遇到障碍时,它会...

    面试准备:算法+后端+编程题.zip

    常见的算法类型包括排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、广度优先搜索、深度优先搜索)、图论(如最短路径算法Dijkstra、最小生成树Prim或Kruskal)、动态规划(如背包问题、最长公共子序列...

    DD牛的背包九讲 背包算法的深入讲解

    ### DD牛的背包九讲:背包算法的深入讲解 #### 01背包 01背包问题是最基础也是最典型的背包问题之一。问题描述为:给定N种物品和一个容量为V的背包,每种物品都有一个重量c[i]和一个价值w[i]。问如何选择这些物品...

    背包问题,自然数拆分问题(Java递归实现,含分析)

    实验报告涉及两个经典算法问题,分别是背包问题和自然数拆分问题,这两个问题都是通过递归的方法来解决的。在Java编程环境下,我们先来看背包问题。 背包问题,也称为0/1背包问题,是一种经典的组合优化问题。给定...

    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明及注释.zip

    否则,将物品进行拆分,将部分物品装进背包中。当背包剩余容量为0时,停止循环,返回最优总价值。 蛮力法 求0-1背包问题最优解。首先穷举物品的全部子集,设置一个记录最大价值的变量maxvalue,遍历所有子集,计算...

    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明.zip

    否则,将物品进行拆分,将部分物品装进背包中。当背包剩余容量为0时,停止循环,返回最优总价值。函数设计如下: ```python def Greedy_F(n,c): #贪心算法求解分数背包问题最优解 #n表示物品个数,c表示背包容量 ...

    贪心算法解多重背包代码

    使用贪心算法解决多重背包问题(物体可拆分)的具体C++代码

    VB实现01背包问题

    每个物品只能选择0或1个,不能拆分,因此得名“01背包”。 **动态规划解法** 解决01背包问题的经典方法是使用动态规划。动态规划的核心思想是将原问题分解为子问题,通过构建一个二维数组dp来存储每个子问题的最优...

    算法文档无代码浅谈几类背包问题

    不过,在实际学习背包问题时,可以通过网络搜索和参考文献来获取更深入的资料和实例,例如《算法导论》、《数据结构与算法分析》以及各种在线算法教程等。 综合来看,背包问题是一个经典的算法问题,通过动态规划等...

    背包问题的算法设计策略对比及分析实施报告.doc

    本报告将对比和分析几种不同的算法设计策略,以解决0-1背包问题。 首先,我们需要理解算法复杂性分析的重要性。算法复杂性主要分为时间复杂性和空间复杂性,它们分别衡量了算法执行时间和所需内存。在评估算法效率...

    常用算法程序集,第6版

    4. **动态规划**:动态规划是一种用于求解最优化问题的方法,例如背包问题、最长公共子序列、矩阵链乘法等。它通过将问题分解成子问题,避免了重复计算,从而提高效率。 5. **贪心算法**:贪心算法在每一步选择最优...

    C常用算法程序集+C常用算法程序集

    - **背包问题**:0/1背包、完全背包、多重背包,求解能装入背包的最大价值。 - **最长公共子序列**:寻找两个序列中最长的不降序子序列。 4. **图论算法**: - **深度优先搜索(DFS)**:遍历或搜索树或图的一种...

    动态规划解决算法0-1背包问题实验报告含源代码.doc

    动态规划解决算法0-1背包问题实验报告含源代码.doc 本实验报告旨在解决0-1背包问题,使用动态规划法和回溯法生成两个长字符串的最优化比对结果,并且掌握动态规划、贪心算法、回溯法、分支限界法的原理,并能够按其...

    麻省理工算法导论全集(教材+讲义+答案).

    7. **动态规划**:通过构建状态转移方程解决最优化问题,如背包问题、最长公共子序列、矩阵链乘法等。动态规划通常用于处理有重叠子问题和最优子结构的问题。 8. **回溯法**:在解决问题时,若发现当前选择不能导致...

    动态规划解决算法0~1背包问题实验报告(含源代码).doc

    动态规划解决算法0/1背包问题实验报告 动态规划是指在数学和计算机科学中,通过拆分复杂问题,递归地解决问题的方法。它将问题分解成更小的子问题,然后解决这些子问题,从而解决原始问题。动态规划法广泛应用于...

    背包问题九讲2.0(13年修订版)

    一种常见方法是使用二进制拆分技术,将每种物品的两个费用进行拆分,再使用常规背包问题的解法求解。 **5.3 物品总个数的限制** 当问题中还额外限制了物品的总数时,可以在动态规划的过程中增加一个维度来记录已...

    背包问题九讲 2.0.pdf

    对于01背包问题,使用传统的01背包算法;对于完全背包问题,使用相应的优化算法。 **再加上多重背包**:当问题进一步包含多重背包问题时,可以将多重背包问题转化为01背包问题,然后将整个问题视为01背包问题和完全...

    常用算法程序集源代码

    - 背包问题:0-1背包、完全背包和多重背包,求解如何在容量限制下使总价值最大化。 - 最长公共子序列(LCS):找到两个序列最长的不相交子序列。 - 最长递增子序列(LIS):找到数组中最长的递增子序列。 - 矩阵...

Global site tag (gtag.js) - Google Analytics