#yyds干货盘点# 动态规划专题:兑换零钱
发布时间:2023-10-23 12:06:39 403 相关标签:
1.简述:
描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
数据范围:数组大小满足 , 数组中每个数字都满足 ,
要求:时间复杂度 ,空间复杂度
输入描述:
第一行给定两个正整数分别是 n 和 aim 分别表示数组 arr 的长度和要找的钱数。
第二行给定 n 个正整数表示 arr 数组中的所有元素
输出描述:
输出组成 aim 的最少货币数
示例1
输入:
输出:
说明:
示例2
输入:
输出:
示例3
输入:
输出:
说明:
2.代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int aim = reader.nextInt();
int[] arr = new int[n + 1];
for (int i = 1; i <= n; i++) {
arr[i] = reader.nextInt();
}
int[] dp = new int[aim + 1];
// 完全背包
Arrays.fill(dp, Integer.MAX_VALUE - 10001);
dp[0] = 0;
for (int i = 1; i <= aim; i++) {
for (int j = 1; j <= n; j++) {
if (i >= arr[j]) {
dp[i] = Math.min(dp[i - arr[j]] + 1, dp[i]);
}
}
}
if (dp[aim] == Integer.MAX_VALUE - 10001)
System.out.println(-1);
else
System.out.println(dp[aim]);
}
}
文章来源: https://blog.51cto.com/u_15488507/5878340
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报