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;
}
}
分享到:
相关推荐
基于单片机技术的硬币分类计数系统设计.pdf
使用matlab语言,编写的硬币识别程序代码,附图片 可识别一角、五角、一元的三种硬币,进行分类识别,并计算个数以及金额总和
机械原理课程设计硬币分拣包装机.pdf
为解决硬币分类整理困难这一问题,设计了一种性能优越、结构简单的自动硬币分拣机构,为了提高分拣效率采用双通道方式进行分拣,且两通道可同时进行分拣,并采取孔筛方式对硬币进行分类;基于STM32设计了控制...
由于硬币各种旋转角度和输入模式的广泛变化,硬币分类是人工智能及计算机视觉领域中一个极其困难的过程。硬币光面区域的存在是硬币输入模式广泛变化的原因,主要包括两种:镜面反射及光面区域磨损划伤。硬币表面质量...
这是一个硬币分类应用程序,用户可以在其中输入找回硬币的程序(例如,如果要输入£2.35,他们将得到x1£2硬币,x3 10p硬币和x1 5p硬币),用户可以将找回硬币排除在找回的零钱之外,还可以设置系统货币和最小/最大...
基于STC89C52单片机的硬币统计系统设计及仿真---学生实践训练成果.pdf
巴西硬币数据集分类数据集,数据总量:2754张图片,用于5类5、10、25、50和100美分之间的分类。 巴西硬币数据集分类数据集,数据总量:2754张图片,用于5类5、10、25、50和100美分之间的分类。
通过简单的matlab程序对硬币的数量和表示的数额进行分类,属于简单图像识别的应用
利用matlab进行制作开发的app,硬币识别程序,需要在matlab2019以上版本运行,其他低一点的版本没试过能否运行,应该可以吧,,,程序进行了较大智能化的操作,能够进行分类识别三种硬币以及两种硬币,并进行计数...
这是一个硬币分拣机。可以自动进行一元,0.5元和1角硬币的自动分类和分拣。
实现硬币检测与分类,并圈出对应硬币,例如一元五角等
行业分类-设备装置-实现纸硬币分离及纸币分类的装置和智能投币箱.zip
通过简单的matlab程序对硬币的数量和表示的数额进行分类,属于简单图像识别的应用matlab
行业分类-外包设计-硬币包装机及硬币包装方法的介绍分析.rar
按面值分类的欧元硬币图像数据集
行业分类-设备装置-实现纸硬币分离及纸币分类的装置、方法和智能投币箱
关于em算法的具体实现,,包括对硬分类和软分类方法硬币投掷问题的具体程序分析
通过简单的matlab程序对硬币的数量和表示的数额进行分类,属于简单图像识别的应用