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;
}
}
硬币分类
最新推荐文章于 2018-11-29 13:40:57 发布