当前位置: 首页 > wzjs >正文

朔州城市建设网站快速排名软件案例

朔州城市建设网站,快速排名软件案例,网易邮箱企业版,网站推广做多大尺寸toc 题目描述 给定一个数组 arr,数组中的每个值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张。再给定一个目标金额 aim,要求找出组成 aim 的最少货币数。如果无法组成 aim,则返回 -1。 数据范围…

@toc

题目描述

给定一个数组 arr,数组中的每个值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张。再给定一个目标金额 aim,要求找出组成 aim 的最少货币数。如果无法组成 aim,则返回 -1

数据范围

  • 数组大小满足 (0 \leq n \leq 10000)
  • 数组中每个数字满足 (0 < val \leq 10000)
  • 目标金额满足 (0 \leq aim \leq 5000)

要求

  • 时间复杂度 (O(n \times aim))
  • 空间复杂度 (O(aim))

示例

示例1

输入

[5, 2, 3], 20

返回值

4

说明

  • 使用 4 张货币(5 + 5 + 5 + 5)可以组成 20。

示例2

输入

[5, 2, 3], 0

返回值

0

说明

  • 目标金额为 0,不需要任何货币。

示例3

输入

[3, 5], 2

返回值

-1

说明

  • 无法用给定的货币组成 2。

参考视频

题解

动态规划

我们可以使用动态规划来解决这个问题。设 dp[i] 表示组成金额 i 所需的最少货币数。状态转移方程如下:

  1. 对于每个金额 i,遍历所有货币面值 arr[j]
  2. 如果 i >= arr[j],则 dp[i] = min(dp[i], dp[i - arr[j]] + 1)

边界条件

  • dp[0] = 0,表示组成金额 0 不需要任何货币。
  • 其他 dp[i] 初始化为一个较大的值(如 5001),表示暂时无法组成该金额。

代码实现

#include <stdio.h>
#include <stdlib.h>/*** 动态规划求解最少货币数* * @param arr int整型一维数组,表示货币的面值* @param arrLen int,表示货币数组的长度* @param aim int整型,表示目标金额* @return int整型,表示组成目标金额的最少货币数,如果无法组成则返回-1*/
int minMoney(int* arr, int arrLen, int aim) {// 分配动态规划数组,dp[i] 表示组成金额 i 所需的最少货币数int* dp = (int*)malloc((aim + 1) * sizeof(int));if (dp == NULL) {printf("Memory allocation failed\n");exit(1);}// 初始化动态规划数组,将所有值设置为一个较大的数(5001,因为题目中 aim 最大为 5000)for (int i = 0; i <= aim; i++) {dp[i] = 5001;}// 组成金额 0 所需的货币数为 0dp[0] = 0;// 动态规划计算每个金额的最少货币数for (int i = 1; i <= aim; i++) {for (int j = 0; j < arrLen; j++) {// 如果当前金额 i 大于等于货币面值 arr[j],以防止dp[i - arr[j]]越界if (i >= arr[j]) {// 如果 dp[i - arr[j]] 是有效的(不是初始值 5001)if (dp[i - arr[j]] != 5001) {// 更新 dp[i] 为 dp[i - arr[j]] + 1 和当前 dp[i] 的最小值dp[i] = (dp[i] < dp[i - arr[j]] + 1) ? dp[i] : dp[i - arr[j]] + 1;}}}}// 如果 dp[aim] 仍然是初始值 5001,表示无法组成金额 aim,返回 -1int result = (dp[aim] == 5001) ? -1 : dp[aim];// 释放动态规划数组free(dp);// 返回结果return result;
}int main() {int arr[] = {5, 2, 3}; // 货币面值数组int arrLen = 3;        // 货币面值数组的长度int aim = 20;          // 目标金额int result = minMoney(arr, arrLen, aim); // 调用函数计算最少货币数printf("Minimum number of coins: %d\n", result); // 打印结果return 0;
}

复杂度分析

  • 时间复杂度:(O(n \times aim)),其中 (n) 是货币数组的长度,aim 是目标金额。我们需要遍历每个金额和每种货币面值。
  • 空间复杂度:(O(aim)),用于存储动态规划数组 dp

总结

本题通过动态规划的方法,将问题分解为子问题,逐步求解。通过状态转移方程,我们可以高效地计算出组成目标金额的最少货币数。如果无法组成目标金额,则返回 -1

http://www.dtcms.com/wzjs/344919.html

相关文章:

  • 济南网站建设制作设计长沙网络营销推广公司
  • 卖软件的平台石家庄seo网络推广
  • 自己免费网站建设哪些网站有友情链接
  • 深圳网站建设及优化广西seo搜索引擎优化
  • 马拉松网站建设中国新冠一共死去的人数
  • 鹰潭网站制作网站收录大全
  • 自己做的网站如何连接入数据库百度品牌广告是什么
  • 福建建设厅网站 资质石景山区百科seo
  • 制作什么网站做毕业设计今日新闻头条新闻今天
  • 小程序定制开发的公司邯郸网站优化
  • 使用cdn的网站免费引流推广
  • SharePoint做网站好吗什么是网络营销平台
  • 往网站添加图片吗怎样免费建立自己的网站
  • 电子商务网站域名网络营销论坛
  • 广告公司怎么取名字网站seo系统
  • 抄袭网站模板全网推广平台
  • 滚动视觉差网站app开发网站
  • 昆明网站建设公司排名猫咪科技最新seo网站优化教程
  • 网站 建设需个人自己免费建网站
  • 个人微信网站怎么做企业网站建设制作
  • 哪家做网站的公司谷歌浏览器下载手机版
  • 石湾网站设计百度导航下载2020新版语音
  • 常德建设网站seo排名哪家正规
  • 做可视化的网站seo服务套餐
  • wordpress时间轴模版搜索引擎的优化方法有哪些
  • 杭州外贸网站建设公司seo入门培训学校
  • 免费网站建设的基本流程网络广告投放公司
  • 给公司做网站费用哈尔滨seo和网络推广
  • 佛山做外贸网站服务seo排名点击器原理
  • 网站建设的难处seo的工作内容