代码拉取完成,页面将自动刷新
arr
,arr
中所有的值都为正数,每个值钱的面值,再给定一个整数aim
代表要找的钱数,求组成aim
的所有方法空间压缩:将原要使用的二维数组压缩称为一维数组
考虑:
这是对于数组内的钱可以无限使用的情况:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String mn = scanner.nextLine();
Integer N = Integer.valueOf(mn);
int []base = {3,5,6,12,4,2};
System.out.println(getMinCoinOne(base,N));
}
private static int getMinCoinOne(int[] base, Integer n) {
int length = base.length;
// helper[i + 1]表示目标为i+1块钱的值
int []helper = new int[n + 1];
for (int j = 0; base[0]*j <= n; j ++){
// 等于 0 的时候也是一种情况
helper[base[0]*j] = 1;
}
// 从第二个钱开始
for (int i = 1 ; i < length; i ++){
for (int j = 1; j <= n; j ++){
helper[j] += j - base[i] < 0 ? 0 : helper[j - base[i]];
}
}
return helper[n];
}
}
* 出现了钱币钱数限制的时候:这个时候不适合使用**压缩空间**的方式:
* 对于使用了**压缩空间**的方式对于单张钱币使用次数无法进行计算
* 而使用二维数组:可以探寻限制情况
`不用moneys[i], 只用moneys[0~i-1]组成j,此时方法数是dp[i-1][j]
<3.2> 用一张moneys[i], 且用moneys[0~i-1]组成j-1*moneys[i],此时方法数是dp[i-1][j-1*moneys[i]]
<3.3> 用两张moneys[i], 且用moneys[0~i-1]组成j-2*moneys[i],此时方法数是dp[i-1][j-2*moneys[i]]
<3.4> 用三张moneys[i], 且用moneys[0~i-1]组成j-3*moneys[i],此时方法数是dp[i-1][j-3*moneys[i]]`
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。