news 2026/2/4 0:32:02

UVa 147 Dollars

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 147 Dollars

题目描述

新西兰货币包含以下面值的纸币和硬币:

  • 纸币:$100$50$20$10$5
  • 硬币:$2$150c20c10c5c

题目要求:给定一个金额(以美元为单位,保证是5c的整数倍),计算该金额可以由这些面值组合成的不同方式数量。顺序不同不算不同方式。例如20c有以下四种组合方式:

  1. 1 × 20c
  2. 2 × 10c
  3. 10c + 2 × 5c
  4. 4 × 5c

输入格式

  • 输入包含多行,每行一个实数,表示金额,不超过$300.00
  • 每个金额保证是5c的整数倍。
  • 输入以一行0.00结束。

输出格式

  • 每个金额输出一行,包含金额(保留两位小数,右对齐,宽度为6 66)和组合方式数量(右对齐,宽度为17 1717)。

示例输入

0.20 2.00 0.00

示例输出

0.20 4 2.00 293

问题分析

这是一个典型的完全背包计数问题。我们需要计算用给定面值的硬币组成目标金额的不同组合数,且不考虑顺序。

为了方便计算,我们可以将金额统一转换为分(cents \texttt{cents}cents为单位。因为所有面值都是5c的整数倍,因此可以将金额除以5 55来简化问题规模。


转换面值

转换后的面值(以5c为单位):

原面值转换后(单位:5c
5c1
10c2
20c4
50c10
$120
$240
$5100
$10200
$20400
$501000
$1002000

这样,问题转化为:用上述11 1111种面值(单位是5c),组成目标金额n nn(已除以5 55)的不同方式数。


动态规划设计

d p [ i ] dp[i]dp[i]表示组成金额i ii的组合方式数量。
初始状态:d p [ 0 ] = 1 dp[0] = 1dp[0]=1(什么也不取算一种方式)。

状态转移方程:
对于每种面值c cc,遍历j jjc cc到最大金额:
d p [ j ] + = d p [ j − c ] dp[j] += dp[j - c]dp[j]+=dp[jc]

该方程表示:若我们使用一个面值为c cc的硬币,则剩余金额为j − c j-cjc,其组合数为d p [ j − c ] dp[j-c]dp[jc],累加到当前d p [ j ] dp[j]dp[j]中。


算法步骤

  1. 将金额转换为整数(分),再除以5 55得到目标值t a r g e t targettarget
  2. 使用动态规划预处理出所有可能金额(最大为300.00 300.00300.00,即6000 600060005c单位)的组合数。
  3. 对每个输入金额,直接查表输出。

代码实现

// Dollars// UVa ID: 147// Verdict: Accepted// Submission Date: 2016-01-22// UVa Run Time: 0.012s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net//// PDF 格式的试题描述和 UVa 网页上的试题描述有出入,主要是上限提高到 300 美元。输出格式亦有改变。#include<bits/stdc++.h>usingnamespacestd;longlongintcache[6001]={0};voidinitialize(){// 面值以 5c 为单位intcoins[11]={1,2,4,10,20,40,100,200,400,1000,2000};cache[0]=1;for(inti=0;i<11;i++)for(intj=1;j<6001;j++)if(j-coins[i]>=0)cache[j]+=cache[j-coins[i]];}intmain(intargc,char*argv[]){initialize();string line;while(cin>>line){string backup=line;line.erase(line.find('.'),1);// 去掉小数点istringstreamiss(line);intmoney;// 单位:分iss>>money;if(money==0)break;// 输出格式:金额右对齐宽度6,组合数右对齐宽度17cout<<fixed<<setprecision(2)<<setw(6)<<right<<backup;cout<<setw(17)<<right<<cache[money/5]<<endl;}return0;}

复杂度分析

  • 预处理O ( 11 × 6000 ) ≈ 66000 O(11 \times 6000) \approx 66000O(11×6000)66000次操作,可忽略不计。
  • 查询O ( 1 ) O(1)O(1)
  • 空间复杂度:O ( 6000 ) O(6000)O(6000)

总结

本题是完全背包计数问题的典型应用,通过金额单位归一化(除以5c)简化了计算,利用动态规划预处理所有可能金额的组合数,实现了高效查询。注意输入金额需要正确处理为整数形式,并满足输出格式要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/4 3:26:51

GTE中文文本嵌入模型企业应用:制造业设备维修手册语义检索系统

GTE中文文本嵌入模型企业应用&#xff1a;制造业设备维修手册语义检索系统 1. 为什么制造业维修文档急需“能读懂人话”的检索系统 你有没有见过这样的场景&#xff1a;一台价值百万的数控机床突然报警停机&#xff0c;现场工程师翻着厚厚三本纸质维修手册&#xff0c;在“PL…

作者头像 李华
网站建设 2026/2/4 5:57:36

RexUniNLU开源大模型教程:ModelScope模型加载+Gradio UI二次开发

RexUniNLU开源大模型教程&#xff1a;ModelScope模型加载Gradio UI二次开发 1. 这不是另一个NLP工具&#xff0c;而是一站式中文语义理解中枢 你有没有遇到过这样的情况&#xff1a;想分析一段新闻&#xff0c;既要找出里面的人名地名&#xff0c;又要判断情绪倾向&#xff0…

作者头像 李华
网站建设 2026/2/4 7:07:33

GLM-4V-9B图文对话效果展示:会议白板照片转结构化会议纪要生成

GLM-4V-9B图文对话效果展示&#xff1a;会议白板照片转结构化会议纪要生成 1. 为什么一张白板照片能变成清晰的会议纪要&#xff1f; 你有没有过这样的经历&#xff1a;开完一场头脑风暴会议&#xff0c;白板上密密麻麻写满了关键词、流程图、待办事项和箭头连线&#xff0c;…

作者头像 李华
网站建设 2026/2/4 2:45:30

Flowise开源生态建设:Marketplace模板审核标准与发布流程

Flowise开源生态建设&#xff1a;Marketplace模板审核标准与发布流程 1. Flowise是什么&#xff1a;让AI工作流搭建像搭积木一样简单 Flowise 是一个在2023年正式开源的可视化低代码平台&#xff0c;它的核心目标很实在&#xff1a;把原本需要写几十行LangChain代码才能完成的…

作者头像 李华
网站建设 2026/2/4 12:10:39

网络小说资源保存与永久阅读解决方案:告别404的数字阅读新方式

网络小说资源保存与永久阅读解决方案&#xff1a;告别404的数字阅读新方式 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读日益普及的今天&#xff0c;小说爱好者面临着内…

作者头像 李华
网站建设 2026/2/4 21:04:18

语音数据预处理捷径:FSMN-VAD开箱即用体验

语音数据预处理捷径&#xff1a;FSMN-VAD开箱即用体验 在语音识别、智能客服、会议转录等实际项目中&#xff0c;你是否也遇到过这些问题&#xff1a; 一段5分钟的会议录音里&#xff0c;真正说话的时间可能只有2分半&#xff0c;其余全是静音、咳嗽、翻纸声&#xff1b; ASR模…

作者头像 李华