news 2026/3/26 17:40:06

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/3/14 6:05:49

医疗AI新体验:MedGemma-X影像诊断快速入门指南

医疗AI新体验&#xff1a;MedGemma-X影像诊断快速入门指南 1. 为什么放射科医生开始用“对话”看片&#xff1f; 你有没有见过这样的场景&#xff1a;一位放射科医生盯着一张胸部X光片&#xff0c;眉头微皱&#xff0c;手指在屏幕上轻轻划过肺野边缘&#xff0c;自言自语&#…

作者头像 李华
网站建设 2026/3/12 14:38:20

从0开始玩转VibeThinker-1.5B,数学竞赛题轻松应对

从0开始玩转VibeThinker-1.5B&#xff0c;数学竞赛题轻松应对 你是否试过在深夜刷一道AIME真题&#xff0c;卡在第三步推导&#xff0c;翻遍论坛却找不到清晰的思维链&#xff1f;是否在LeetCode上反复提交&#xff0c;只因边界条件没想全&#xff1f;又或者&#xff0c;你只是…

作者头像 李华
网站建设 2026/3/25 14:11:23

Qwen3-32B Web网关安全加固:Clawdbot支持IP白名单与速率限制

Qwen3-32B Web网关安全加固&#xff1a;Clawdbot支持IP白名单与速率限制 1. 为什么需要给AI网关加把“锁” 你有没有遇到过这样的情况&#xff1a;刚部署好一个基于Qwen3-32B的Chat平台&#xff0c;第二天就发现API调用量暴增&#xff0c;响应变慢&#xff0c;甚至出现异常请…

作者头像 李华
网站建设 2026/3/26 8:31:58

Qwen3-VL-4B Pro保姆级教程:从图片上传到智能问答全流程

Qwen3-VL-4B Pro保姆级教程&#xff1a;从图片上传到智能问答全流程 1. 这不是“又一个看图说话”工具——它到底强在哪&#xff1f; 你可能已经用过不少图文对话模型&#xff1a;传张图&#xff0c;问个问题&#xff0c;得到一段文字回答。但Qwen3-VL-4B Pro不是那种“能说就…

作者头像 李华
网站建设 2026/3/12 23:10:35

3大核心功能助力视频分析:B站数据采集工具全解析

3大核心功能助力视频分析&#xff1a;B站数据采集工具全解析 【免费下载链接】Bilivideoinfo Bilibili视频数据爬虫 精确爬取完整的b站视频数据&#xff0c;包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时间、视频时长、…

作者头像 李华