package com.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CoinCount {
private int totalaccount = 200;
private int[] values;
private static final int SORT_DIRECTION_ASCENDING = 0x1000;
private static final int SORT_DIRECTION_DESCENDING = 0x1001;
private Map<Integer, Integer> resultList = new HashMap();
public int gettotalaccount() {
return totalaccount;
}
public void settotalaccount(int tOTALACCOUNT) {
totalaccount = tOTALACCOUNT;
}
public int[] getValues() {
return values;
}
public void setValues(int[] values) {
this.values = values;
}
public void calculate() {
initValues();
// values = new int[] { 46, 42, 42, 39, 27, 25, 9, 6, 1, 1 };
values = sort(values, SORT_DIRECTION_DESCENDING);
System.out
.println("the target is :" + totalaccount + "\nthe input is:");
for (int i = 0; i < values.length; i++) {
System.out.print(values[i] + " ");
}
System.out.println();
find(0, 0, 0);
if (check()) {
// 结果符合要求
System.out.println("the result is :");
for (int i = 0; i < resultList.size(); i++) {
System.out.println(values[i] + "==>" + resultList.get(i));
}
} else {
System.out.println("none result at all");
}
}
private int find(int depth, int count, int totalCount) {
// 边界条件
if (depth >= values.length)
return 0;
int value = values[depth];
if (value + totalCount == totalaccount) {
resultList.put(depth, ++count);
return 0;
} else if (value > totalaccount) {
return find(++depth, 0, totalCount);
} else if (value + totalCount > totalaccount) {
if (count < 1) {
// 向下回溯
resultList.put(depth, 0);
value = find(++depth, 0, totalCount);
return value;
} else {
resultList.put(depth, count);
return find(++depth, 0, totalCount);
}
}
totalCount += value;
return find(depth, ++count, totalCount);
}
/**
* 初始化价格数组——纯粹是为了演示方便
*/
private void initValues() {
values = new int[10];
for (int i = 0; i < values.length; i++) {
values[i] = (int) (Math.random() * 50 + 1);
}
}
/**
* 数组排序
*
* @param arr
* @param direction
* 排序方向 升序||降序
* @return
*/
public int[] sort(int arr[], int direction) {
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
// 判断是升序还是降序
boolean flag = false;
if (direction == SORT_DIRECTION_ASCENDING) {
flag = (values[j] < values[i]);
} else if (direction == SORT_DIRECTION_DESCENDING) {
flag = (values[j] > values[i]);
}
if (flag) {
int temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
return values;
}
/**
* 检查结果是否正确
*
* @return
*/
private boolean check() {
boolean flag = false;
int sum = 0;
for (int i = 0; i < resultList.size(); i++) {
sum += resultList.get(i) * values[i];
}
if (sum == totalaccount)
flag = true;
return flag;
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用MATLAB进行硬币分类识别。MATLAB是一种强大的数学计算软件,常用于图像处理和机器学习任务,如本例中的硬币分类。这个项目的目标是设计一个程序,能够自动识别并区分一角、五角和...
基于单片机技术的硬币分类计数系统设计是一个结合机械装置和电子技术的智能化解决方案,旨在解决市场上对快速、准确处理大量硬币的需求。该系统利用硬币尺寸的不同,通过机械方式对硬币进行分类,并使用光电传感器...
机械系统可以分为7个主要功能单元,包括硬币堆放、输送功能单元、硬币排列、分选功能单元、硬币分选计数功能单元、硬币堆码、整理功能单元、送纸、撕纸功能单元、硬币包装功能单元和卷边功能单元。控制系统则负责...
一、硬币分类 硬币整理打包装置首先进行的是硬币分类。它通常配备有多个大小不同的滚轮或轨道,以适应不同国家和地区发行的各种面额的硬币。硬币进入装置后,会根据其直径和厚度被引导至相应的通道,从而实现不同...
标题提及的自动硬币分拣机设计是基于STM32微控制器的,旨在解决硬币分类和整理的难题。设计特点在于采用了双通道分拣方式,允许两通道同时进行分拣,以提升效率。硬币分类是通过孔筛方式进行,确保了精确性。STM32...
由于硬币各种旋转角度和输入模式的广泛变化,硬币分类是人工智能及计算机视觉领域中一个极其困难的过程。硬币光面区域的存在是硬币输入模式广泛变化的原因,主要包括两种:镜面反射及光面区域磨损划伤。硬币表面质量...
这是一个硬币分类应用程序,用户可以在其中输入找回硬币的程序(例如,如果要输入£2.35,他们将得到x1£2硬币,x3 10p硬币和x1 5p硬币),用户可以将找回硬币排除在找回的零钱之外,还可以设置系统货币和最小/最大...
电机驱动电路使用H桥结构,通过控制三极管的导通来控制电机的转动,进而驱动硬币识别器的机械部件,实现对硬币的分类和存储。 系统仿真使用了Proteus软件,这是一种常用的电路仿真软件,能够提供直观的电路设计和...
《模式识别:FISHER判别与硬币问题在感知器中的应用》 模式识别是计算机科学中的一个重要领域,它涉及从数据中提取有用信息...通过这种方式,模式识别技术可以有效地应用于硬币识别问题,实现自动化和精确的硬币分类。
该系统的核心在于图像处理和机器学习技术,旨在帮助自动化硬币分类和计数,对于收藏者、银行或零售环境都具有潜在的应用价值。以下是关于这个系统的详细知识点: 1. 图像获取与预处理: - 图像采集:系统首先需要...
《JS749硬币分拣机的设计》是机械专业设计领域的一项重要作品,它集CAD计算机辅助设计、三维建模以及详细的操作说明书于一体,旨在实现高效、精准的硬币分类与分拣功能。这份设计涵盖了机械设计的核心知识点,包括...
在本文中,我们将深入探讨如何使用...这样的系统对于自动化生产线的质量控制、硬币分类或类似应用具有重要意义。在实际开发过程中,还需要考虑图像质量优化、异常处理、多线程优化等因素,以提高系统的稳定性和效率。
5. **分类与计数**:一旦我们有了硬币的特征,就可以用分类算法(如支持向量机SVM、K近邻KNN或决策树)来区分不同面值的硬币。每个硬币的特征向量会与预先训练好的模型进行匹配,从而确定其面值。硬币数量的计算则...
对于识别不同面额的硬币,可能还需要根据特征值匹配预先训练的模板或利用机器学习算法进行分类。 7. MATLAB编程:该项目使用MATLAB实现,这是一种强大的科学计算环境,提供了丰富的图像处理工具箱,如Image ...
巴西硬币数据集分类数据集,数据总量:2754张图片,用于5类5、10、25、50和100美分之间的分类。 巴西硬币数据集分类数据集,数据总量:2754张图片,用于5类5、10、25、50和100美分之间的分类。
本系统的目标是通过分析输入的硬币图像,自动识别硬币的类型和面值,从而实现自动化分类。 首先,我们要理解数字图像处理的基本概念。数字图像处理是将模拟图像转化为数字形式,并对其进行一系列操作以提取有用信息...
3. **计数与分类**:根据硬币的面值,机器将硬币分拣到不同的通道,每个通道对应一种面值。 4. **包装准备**:当某一路通道的硬币数量达到预设值时,机器会准备相应的包装材料,如卷筒纸或硬币袋。 5. **封装**:...
- **硬币分类**:根据圆的半径差异判断一元和五角硬币,通过循环比较相邻圆的半径差,当差值大于5时,认为是不同种类的硬币。 - **数量统计**:遍历所有圆,统计相同半径且位置相近的硬币数量。 5. **代码实现**...
硬币分拣机是一种自动化设备,它主要用于对各种不同面值的硬币进行识别和分类。在本压缩包中,包含的资源是针对这个主题的毕业设计资料,具体包括SolidWorks 12(SW12)的设计文件、CAD(计算机辅助设计)图纸以及...