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

洛谷 P2842 纸币问题 1 -普及-

题目描述

某国有 nnn 种纸币,每种纸币面额为 aia_iai 并且有无限张,现在要凑出 www 的金额,试问最少用多少张纸币可以凑出来?

输入格式

第一行两个整数 n,wn,wn,w,分别表示纸币的种数和要凑出的金额。
第二行一行 nnn 个以空格隔开的整数 a1,a2,a3,…ana_1, a_2, a_3, \dots a_na1,a2,a3,an 依次表示这 nnn 种纸币的面额。

输出格式

一行一个整数,表示最少使用的纸币张数。

输入输出样例 #1

输入 #1

6 15
1 5 10 20 50 100

输出 #1

2

输入输出样例 #2

输入 #2

3 15
1 5 11

输出 #2

3

说明/提示

对于 40%40\%40% 的数据,满足 n≤10n\le 10n10w≤100w\le 100w100
对于 100%100\%100% 的数据,满足 1≤n≤1031\le n\le 10^31n1031≤ai,w≤1041\le a_i , w\le 10^41ai,w104

solution

动态规划:

  • 1 定义公式:
    • 设 f[i][j]: 如果只用前 i 种纸币,最少需要多少张才能拼成 j 元。
  • 2 递推关系:
    • f[i][j] = min(f[i][j], f[i][j - a[i]] + 1, f[i-1][j])
    • 因为 i 只影响 i + 1,所以只需要保存一个,可以省略一个维度
      递推公式 f[j] = min(f[j], f[j - a[i]] + 1)
  • 3 结果
    f[w]

代码

#include<iostream>
#include "unordered_map"
#include "unordered_set"
#include "stack"
#include "queue"
#include "cstring"
#include "algorithm"using namespace std;
const int N = 1e3 + 5, INF = 1e4, M = 1e4 + 5;int a[N], n, w, f[M];int main() {cin >> n >> w;for (int i = 0; i < n; i++) cin >> a[i];for (int j = 1; j <= w; j++) {f[j] = INF;for (int i = 0; i < n; i++) {if (j >= a[i]) {f[j] = min(f[j], f[j - a[i]] + 1);}}}cout << f[w];return 0;
}

结果

在这里插入图片描述

http://www.lryc.cn/news/622461.html

相关文章:

  • C++类与对象核心知识点全解析(下)
  • 模板方法模式C++
  • 机器翻译:模型微调(Fine-tuning)与调优详解
  • JavaWeb开发_Day13
  • vue3相关基础
  • MySQL知识解析
  • linux-----------------锁
  • week1-[一维数组]传送
  • 【Spring框架】SpringAOP
  • 六大主流负载均衡算法
  • Java项目基本流程(四)
  • Python day45
  • lcm通信库介绍与使用指南
  • 【121页PPT】锂膜产业MESERP方案规划建议(附下载方式)
  • 【学习嵌入式day-25-线程】
  • 华测科技的3D GPR数据分析
  • 前瞻性技术驱动,枫清科技助力制造企业借助大模型完成生产力转化
  • 2025戴尔科技峰会:破局者的力量与智慧
  • 【C#补全计划】事件
  • PCA降维理论详解
  • 学习嵌入式之硬件——I2C
  • 系统介绍pca主成分分析算法
  • C语言:指针(5)
  • 智能指针:C++内存管理的利器
  • c++程序示例:多线程下的实例计数器
  • [HDCTF 2023]Normal_Rsa(revenge)
  • 主流开源实时互动数字人大模型
  • 读书笔记-积极心理学 《心流,最优体验心理学》
  • 条件变量的基本介绍与有界缓冲区问题
  • 小红书帖子评论的nodejs爬虫脚本