硬币面枚举:
public enum CoinSide {HEAD(0), TAIL(1)
private int value
CoinSide(int value) {
this.value = value
}
}
2.硬币类
import java.util.Randompublic class Coin {
private String name
private CoinSide coinSide
public Coin(String name) {
this.name = name
}
public CoinSide getCoinSide() {
return coinSide
}
public void setCoinSide(CoinSide coinSide) {
this.coinSide = coinSide
}
public CoinSide tossCoin() {
Random random = new Random()
int value = random.nextInt(2)
if (value == 0) {
this.coinSide = CoinSide.HEAD
} else {
this.coinSide = CoinSide.TAIL
}
this.printCoinSide()
return this.coinSide
}
public void printCoinSide() {
System.out.println(this.name + " toss " + this.coinSide.name())
}
}
3.主类
public class Main {public static void main(String[] args) {
Coin coin1 = new Coin("coin1")
Coin coin2 = new Coin("coin2")
while (true) {
coin1.tossCoin()
coin2.tossCoin()
if (coin1.getCoinSide() == coin2.getCoinSide() && coin1.getCoinSide() == CoinSide.TAIL) {
break
}
System.out.println("-------------------")
}
}
}
运行演示:
import java.io.IOExceptionimport java.util.HashMap
import java.util.HashSet
import java.util.Map.Entry
import java.util.Scanner
public class Test {
static HashSet<Integer[]> resultSet = new HashSet<Integer[]>()//存放结果
static HashMap<Integer, Integer> coinsMap//将硬币分类 种类——数量
static int max = 0
public static void main(String[] args) throws IOException {
int coins[] = {1,1,2,2,4,4,8,8}//硬币集合
// Scanner sc = new Scanner(System.in)
// int n = sc.nextInt()//输入n的值
int n = 16
count(coins, n)
System.out.println()
System.out.println(resultSet.size())
/* 输出结果 每种硬币的数量*/
for(Integer[] ints : resultSet){
int i = 0
for(Entry<Integer, Integer> entry : coinsMap.entrySet()){
System.out.println("coins:" + entry.getKey() + " num:" + ints[i++] )
}
System.out.println()
}
}
/**
* 将硬币归类并统计每类的数量
* @param coins
* @param n
* @throws IOException
*/
public static void count(int[] coins, int n) throws IOException{
coinsMap = new HashMap<Integer,Integer>()
for(int i = 0i < coins.lengthi ++){
int count = 0
if(coinsMap.containsKey(coins[i])){
count = coinsMap.get(coins[i])
}
++ count
max += coins[i]
coinsMap.put(coins[i], count)
}
Integer[][] pool = new Integer[coinsMap.size()][2]
int index = 0
for(Entry<Integer, Integer> entry: coinsMap.entrySet()){
pool[index][0] = entry.getKey()
pool[index][1] = entry.getValue()
index ++
}
if(n > max){
System.out.println("超过所以硬币总额")
}
else{
recursive(pool, 0, 0, n,new Integer[pool.length])
}
}
/**
* @param pool
* @param coin
* @param sum
* @param n
* @param result
* @throws IOException
*/
public static void recursive(Integer[][] pool,int coin,int sum,int n,Integer result[]) throws IOException{
if(coin == pool.length){//已经考虑了所以种类的硬币时,结束递归
return
}
int tSum = sum
for(int i = 0i <= pool[coin][1]i ++){
int temp = i * pool[coin][0]
tSum = sum + temp
Integer[] _result = new Integer[pool.length]
for(int j = 0 j < coinj ++){
_result[j] = result[j]
}
_result[coin] = i
// for(int k = 0k < coink++) System.out.print(" ")
// System.out.println("coin:"+pool[coin][0] + " num:"+ i + " " + sum + "_" + tSum + " " )
if(tSum == n && coin == pool.length - 1){//已经考虑到最后一种硬币类型且硬币组合的面值与n相等
resultSet.add(_result)
// System.out.println("here is an answer")
}
else{
recursive(pool, coin + 1, tSum, n, _result)
}
}
}
}
好久没写这种的,写了好久。如有不对,欢迎指正!
import java.util.ArrayList/*
* 一元钱硬币有多少种表达方式
* 可供选择:1分,2分,5分,1角,2角,5角,1元
* 如:
* 1元=1元
* 1元=5角+5角
* ....
*/
public class Test {
private static int count
public static void main(String args[]){
int max = 100//一元
int[] cents = {100,50,20,10,5,2,1}//币值
String[] money = {"1元","5角","2角","1角","5分","2分","1分"}
ArrayList collect = new ArrayList()
collectMoney(cents, money,0, max, 0, collect)
System.out.println("总共有"+count+"种搭配方法!")
}
public static void collectMoney(int[] cents,String[] money,int beginIndex,int max,int result,ArrayList collect){
if(result&gt=max){
if(result==max){
count++
System.out.print("1元=")
for(int i=0i&ltcollect.size()i++){
System.out.print(money[(Integer) collect.get(i)])
if(i&ltcollect.size()-1){
System.out.print("+")
}
}
System.out.println()
}
return
}
for(int i=beginIndexi&ltcents.lengthi++){
int cent = cents[i]
collect.add(i)
collectMoney(cents, money,i, max, result+cent, collect)
collect.remove(Integer.valueOf(i))
}
}
}