`
chun521521
  • 浏览: 284218 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

数字拆分算法

    博客分类:
  • java
阅读更多
一个java算法:数字拆分y=100a+50b+30c+20d(y,a,b,c,d都是正整数)
其中y是已知的,a,b,c,d会给出最大值。
求解:当给定一个y时,解出abcd的值,有多组解时,输出a+b+c+d的和最小的那组。



如abcd的最大值分别为2,5,5,5时,

y=10,无法拆分
y=40,此时则a=0,b=0,c=0,d=2
y=60,此时则a=0,b=0,c=2,d=0
y=110,此时则a=0,b=1,c=2,d=0
y=630,此时则a=2,b=5,c=4,d=3
y=800,无法拆分







public class test{

private static final int[] BASE_NUMBER = {100,50,30,20};// 充值卡面值
private static int[] COUNT_NUMBER = {};// 充值卡面值个数
private static int[] RESULT = {0, 0, 0, 0};// 拆分充值卡面值个数



/**
  * 描述:splitPerpainCard 拆分

  * @param num
  * @return
  * @CreateOn 2010-10-20  下午01:55:15
  * @author chun_chang
  */
public static int[] splitPerpainCard(Map<String, Integer> map, int num) {
  RESULT = new int[]{0, 0, 0, 0};
  COUNT_NUMBER = new int[]{ map.get("100"), map.get("50"), map.get("30"), map.get("20") };
  int totleMoney = BASE_NUMBER[0] * COUNT_NUMBER[0] + BASE_NUMBER[1] * COUNT_NUMBER[1]
                 + BASE_NUMBER[2] * COUNT_NUMBER[2] + BASE_NUMBER[3] * COUNT_NUMBER[3];
  if (num % 10 != 0) {
   return null;
  }
  if (totleMoney > num && num >= 20) {
   splitMoney(num, num, 0);
  } else if (totleMoney == num) {
   RESULT[0] = COUNT_NUMBER[0];
   RESULT[1] = COUNT_NUMBER[1];
   RESULT[2] = COUNT_NUMBER[2];
   RESULT[3] = COUNT_NUMBER[3];
  } else {
   return null;
  }
  return RESULT;
}

/**
  * 拆分

  * @param src 总目标数额
  * @param nowSrc 当前目标数额
  * @param level 当前搜索深度
  * @return
  */
public static boolean splitMoney(int src, int nowSrc, int level) {
  // 计算当前充值卡使用总额
  int sum = 0;
  for (int i = 0; i < BASE_NUMBER.length; i++) {
   sum += BASE_NUMBER[i] * RESULT[i];
  }
  // 如果当前充值卡使用总额等于目标总额,是拆分完成
  if (src == sum) {
   return true;
  }
  // 如果当前搜索深度大于最大深度,退出
  if (level >= BASE_NUMBER.length) {
   return false;
  }

  // 计算本层使用充值卡最大数量
  RESULT[level] = nowSrc / BASE_NUMBER[level];
  if (RESULT[level] > COUNT_NUMBER[level]) {
   // 使用数量大于库存,则最大使用量等于库存
   RESULT[level] = COUNT_NUMBER[level];
  }
  int k = RESULT[level];
  for (; k >= 0; k--) {
   RESULT[level] = k;
   // 本次搜索后余额
   int nosplit = nowSrc - BASE_NUMBER[level] * RESULT[level];
   if (nosplit >= BASE_NUMBER[BASE_NUMBER.length - 1]) {
    // 本次搜索后余额大于最低面值,进入下一层搜索
    if (splitMoney(src, nosplit, level + 1)) {
     return true;
    }
   } else if (nosplit == 0) {
    // // 本次搜索后无余额,停止搜索
    return true;
   } else {
    // 本次搜索后余额小于最低面值,回溯
   }
  }

  return false;
}


public static void main(String[] args){
  Map<String, Integer> map = new HashMap<String, Integer>();
  map.put("100", 2);
  map.put("50", 5);
  map.put("30", 5);
  map.put("20", 5);
 
  for (int j = 1; j < 100; j++) {
   int[] rssult = splitPerpainCard(map, j * 10);
   if (null == rssult) {
    System.out.println("无法拆分!");
   } else {
    System.out.println(j * 10 + ":" + rssult[0] +"_"+ rssult[1] +"_"+ rssult[2] +"_"+ rssult[3]);
   }
  }
}



}



分享到:
评论

相关推荐

    拆分数字(java代码).docx

    通过上述代码,我们可以看到一个简单的数字拆分算法的实现方式。这种算法适用于任何非负整数的拆分,并且能够统计出具体的拆分次数。此外,通过调整`splitNumber`方法的逻辑,还可以扩展更多的功能,比如判断数字...

    基于单片机数字拆分的一种高效算法.pdf

    文档提到了一个特定的算法实现,即数字拆分函数。在C语言中,通过指针变量传递数组首地址,并通过形参地址+1来指向数组下一个元素,以此实现高效的数据处理。文章中还提到了实验验证,通过实际的硬件测试来验证算法...

    数码管多位数字拆分的方法

    ### 数码管多位数字拆分的方法 在单片机应用领域中,数码管作为一种常见的显示元件,被广泛应用于各种电子设备中。然而,由于数码管每次只能显示一个数字,因此当我们需要显示多位数字时,就必须采取一定的方法将...

    超额发票单据按照限额拆分java

    5. **数据结构与算法优化**: - 使用集合框架(如 `List` 和 `Map`)来存储拆分后的单据和明细项。 - 采用循环结构和条件判断来实现明细项的拆分逻辑。 6. **异常处理**: - 对于可能出现的异常情况,如数据类型...

    算法参考资料单片机数字滤波算法研究-牛余朋

    首先,“单片机数字滤波算法研究”这个标题涉及到单片机技术和数字信号处理中的滤波算法。我们可以将这个主题拆分为以下几个知识点: 1. 单片机技术基础 - 单片机的定义:单片机是一种集成电路芯片,它把一个...

    论文研究-基于卷积神经网络的手写数字识别算法研究 .pdf

    研究者们提出了基于卷积神经网络(CNN)的手写数字识别方法,特别是针对传统串行方式实现CNN时存在的局限性,张荣磊等研究者通过引入MapReduce模型提出了并行化的CNN算法,旨在提高手写数字识别的准确率和处理速度。...

    data_split.c

    简易数字拆分算法,使用最易懂的c语言编写,可将一个数字进行拆分

    数字 转 金额 最快算法

    3. 分治法:将数字拆分为若干四位的小组,分别转换,然后组合起来。 4. 避免不必要的计算:对0的处理可以特别优化,避免重复计算。 在压缩包内的“大写5”可能是一个示例文件,其中包含了数字5转换成中文大写金额的...

    拆分自然数的几种算法.doc

    ### 拆分自然数的几种算法 #### 一、问题背景与定义 **自然数的拆分**指的是任何一个大于1的自然数\( N \),都可以被表示为若干个自然数之和,并且存在多种不同的拆分方式。例如,数字5可以被拆分为: - \( 5 = 1...

    乘积最大的拆分.zip

    标题“乘积最大的拆分”涉及的是一个计算机算法问题,主要目标是从一组数字中找到一种拆分方式,使得这些数字相乘的结果最大。这通常在数据结构与算法的学习中出现,尤其是在解决数学优化问题时。这类问题可能出现在...

    基于python数字图像可视化水印系统的设计与实现(LSB算法、DCT算法、随机间隔算法、区域校验位算法、图像降级算法)

    (LSB算法、DCT算法、随机间隔算法、区域校验位算法、图像降级算法、图像降级算法改进等6种数字水印算法的实现) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、...

    组合数学及其算法

    5.3 整数的拆分 5.4 ferrers图 5.5 指数型母函数 习 题 第六章 递归关系 6.1 引言 6.2 几个典型的递归关系.. 6.3 用母函数方法求解递归关系 6.4 常系数线性齐次递归关系的求解 6.5 常系数线性非齐...

    C经典算法之数字拆解

    根据给定的信息,本文将详细解析“C经典算法之数字拆解”这一主题,包括算法原理、代码解读以及实现思路。 ### 算法背景与原理 #### 数字拆解问题定义 数字拆解问题是一种经典的组合数学问题,其目标是求出一个正...

    计算机算法设计与分析课程设计.doc

    在本文档中,算法分析被应用于对分治法和回溯法的分析,了解它们在解决棋盘覆盖问题和数字拆分问题中的性能和效率。 结论 本文档旨在帮助学生了解计算机算法设计与分析的基本概念和方法,提高学生的算法设计与分析...

    利用mysql实现的雪花算法案例

    在当今的互联网环境中,分布式系统和微服务架构越来越常见,随之而来的是数据库的拆分与分表需求。在这种背景下,如何生成全局唯一且不重复的ID成为了一个重要的问题。本文将详细介绍如何利用MySQL实现雪花算法,这...

    FFT快速蝶形算法矩阵分解算法

    总的来说,这个项目涉及了数字信号处理的核心概念,包括离散傅里叶变换、快速傅里叶变换的蝶形运算和矩阵分解,这些都是现代通信和信号处理领域不可或缺的知识。通过实际编写和运行代码,学习者不仅可以掌握理论知识...

    数字五笔中文输入系统2007包含注册机

    数字五笔中文输入法是一种基于五笔字型编码的输入工具,其核心是将汉字拆分成不同的笔画和部件,通过记忆特定的编码来快速输入汉字。这种输入方式对于熟悉五笔规则的用户来说,具有高速输入的优势,尤其适合需要大量...

    GPU上数字图像处理并行算法实现

    数字图像处理并行算法的实现,特别在GPU(图形处理单元)上,已经成为高性能计算中的一个重要分支。并行计算能够加速数字图像处理任务,这在医疗成像、天文观测、视频压缩等领域有着广泛的应用。 并行算法的主要...

    基于Python实现 KNN 算法和 Decision Trees 算法

    (⼀) 在 jupyter notebook 中,实现 KNN 算法和 Decision Trees 算法,要求有完整的注释 (⼆) ⼿手写数字识别 样本中包含1797个⼿手写数字灰度图像,每个图像⼤大⼩小为8*8,可使⽤用 numpy.load('filename.npy') 进...

    算法大全(基本包括了所有基本算法)

    - Strassen矩阵乘法:将大矩阵拆分为小矩阵,减少乘法操作。 8. **数据结构**: - 树结构:如二叉树、AVL树、红黑树等,用于高效查找、插入和删除。 - 队列和栈:线性数据结构,用于数据的存储和处理。 - 哈希...

Global site tag (gtag.js) - Google Analytics