`
treagzhao
  • 浏览: 6443 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

硬币分类

阅读更多
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;
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics