java 动态规划,递归实现 找零问题,币值最大化
package package1;
import java.util.Random;
class Coin {
int monly;
int num;
public Coin(int monly, int num) {
this.monly = monly;
this.num = num;
}
}
public class alg {
public static int maxCoin(int[] n) {
int a = 0, b = n[0], c = 0;
for (int i = 1; i < n.length; i++) {
c = Math.max(a + n[i], b);
a = b;
b = c;
}
return c;
}
public static int recMaxCoin_(int[] n, boolean isChoose, int point, int monly) {
if (point == n.length) {
return monly;
} else if (isChoose) {
return recMaxCoin_(n, false, point + 1, monly);
} else {
return Math.max(recMaxCoin_(n, false, point + 1, monly), recMaxCoin_(n, true, point + 1, monly + n[point]));
}
}
public static int recMaxCoin(int[] n) {
return Math.max(recMaxCoin_(n, false, 1, 0), recMaxCoin_(n, true, 1, n[0]));
}
public static int minCoin(int[] n, int num) {
Coin[] coin = new Coin[num + 1];
coin[0] = new Coin(0, 0);
for (int i = 1; i <= num; i++) {
int j = 0, t = Integer.MAX_VALUE;
while (j < n.length && n[j] <= i) {
int temp = F(i - n[j], i, coin);
if (temp == -1) {
System.out.println("找零问题出错!!! monly = " + (i - n[j]) + " 找不到对应最小硬币个数!");
}
t = Math.min(temp, t);
j++;
}
coin[i] = new Coin(i, t + 1);
}
return coin[num].num;
}
public static int recMinCoin(int[] n, int num) {
int min = num;
for (int i : n) {
if (i == num)
return 1;
}
int mincoin = 0;
for (int i : n) {
if (i < num) {
mincoin = 1 + recMinCoin(n, num - i);
if (mincoin < min) {
min = mincoin;
}
}
}
return min;
}
public static int F(int monly, int maxIndex, Coin[] coins) {
for (int i = 0; i < maxIndex; i++) {
if (coins[i].monly == monly)
return coins[i].num;
}
return -1;
}
public static int[] initArray(int len) {
int[] n = new int[len];
Random random = new Random();
for (int i = 0; i < len; i++) {
n[i] = random.nextInt(10);
}
return n;
}
public static void main(String[] args) {
int[] n = initArray(40);
int[] m = {
1,2,5,10};
int[] t = initArray(10);
long a = System.currentTimeMillis();
System.out.println("币值最大化 动态规划:" + maxCoin(n));
long b = System.currentTimeMillis();
System.out.println("耗时:" + (b - a) + "ms" + " 长度: " + n.length);
a = System.currentTimeMillis();
System.out.println("币值最大化 递归求解:" + recMaxCoin(n));
b = System.currentTimeMillis();
System.out.println("耗时:" + (b - a) + "ms" + " 长度: " + n.length);
a = System.currentTimeMillis();
System.out.println("找零 动态规划:" + minCoin(m, 40));
b = System.currentTimeMillis();
System.out.println("耗时:" + (b - a) + "ms" + " 长度: " + m.length + "零钱: 40");
a = System.currentTimeMillis();
System.out.println("找零 递归求解:" + recMinCoin(m, 40));
b = System.currentTimeMillis();
System.out.println("耗时:" + (b - a) + "ms" + " 长度: " + m.length+ "零钱: 40");
}
}
结果
