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

UVa 357 Let Me Count The Way

题目描述

Mel\texttt{Mel}Mel在大商场购物后收到171717美分找零:111101010美分、111555美分和222111美分。当天晚些时候,他在便利店购物,又收到171717美分找零:222555美分和777111美分。他开始思考:“有多少种不同的硬币组合可以组成171717美分?”经过一番思考,他得出答案是666种。现在他要求你考虑一般情况。

编写程序,计算用美国硬币(111美分、555美分、101010美分、252525美分、505050美分)组成给定金额的不同组合数。

输入格式

输入包含一组000300003000030000之间的整数,每行一个。

输出格式

对于每个输入值,输出相应语句:

  • 如果有多种组合:There are m ways to produce n cents change.
  • 如果只有111种组合:There is only 1 way to produce n cents change.

样例输入

17 11 4

样例输出

There are 6 ways to produce 17 cents change. There are 4 ways to produce 11 cents change. There is only 1 way to produce 4 cents change.

题目分析

问题的本质

这是一个经典的硬币找零问题coin change problem\texttt{coin change problem}coin change problem),属于完全背包问题:给定几种面额的硬币(每种无限供应),求组成特定金额的不同组合数。

硬币种类

  • Penny\texttt{Penny}Penny111美分)
  • Nickel\texttt{Nickel}Nickel555美分)
  • Dime\texttt{Dime}Dime101010美分)
  • Quarter\texttt{Quarter}Quarter252525美分)
  • Half-dollar\texttt{Half-dollar}Half-dollar505050美分)

数据范围

金额最大为300003000030000,硬币种类为555种。使用动态规划可以在O(5×30000)O(5 \times 30000)O(5×30000)的时间内预处理所有结果。

组合与排列的区别

本题要求的是组合数(不考虑硬币顺序),而不是排列数。例如,用111美分和555美分组成666美分:

  • 组合:1+51+51+5(只有一种)
  • 排列:1+51+51+55+15+15+1(两种)

动态规划中的完全背包通常计算的是组合数(通过限制外层循环为硬币种类)。


解题思路

步骤一:动态规划状态定义

dp[i][j]dp[i][j]dp[i][j]表示使用前iii种硬币组成金额jjj的组合数。

步骤二:状态转移方程

对于硬币种类iii,面额为cic_ici

  • 不使用第iii种硬币:dp[i−1][j]dp[i-1][j]dp[i1][j]
  • 使用第iii种硬币(至少一枚):dp[i][j−ci]dp[i][j - c_i]dp[i][jci]

因此:
dp[i][j]=dp[i−1][j]+dp[i][j−ci] dp[i][j] = dp[i-1][j] + dp[i][j - c_i]dp[i][j]=dp[i1][j]+dp[i][jci]

步骤三:初始化

dp[0][0]=1dp[0][0] = 1dp[0][0]=1(用000种硬币组成000金额有111种方式)

步骤四:空间优化

可以使用一维数组,但需要按硬币顺序正向遍历(完全背包):

for(intcoin:cents)for(intj=coin;j<=MAX;j++)ways[j]+=ways[j-coin];

但注意:一维正向遍历计算的是组合数(因为硬币按顺序添加,避免重复计算不同顺序)

步骤五:预处理

由于n≤30000n \leq 30000n30000,可以预先计算所有金额的结果,然后直接查表输出。


参考代码

// Let Me Count The Ways// UVa ID: 357// Verdict: Accepted// Submission Date: 2016-06-25// UVa Run Time: 0.010s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){vector<int>cents={1,5,10,25,50};// 二维 DP 数组:dp[i][j] 表示用前 i 种硬币组成金额 j 的组合数longlongintways[6][30010]={0};ways[0][0]=1;// 边界条件// 动态规划预处理for(inti=1;i<=5;i++)// 枚举硬币种类for(intj=0;j<=30000;j++){// 不使用第 i 种硬币ways[i][j]=ways[i-1][j];// 使用至少一枚第 i 种硬币if(j-cents[i-1]>=0)ways[i][j]+=ways[i][j-cents[i-1]];}intn;while(cin>>n){if(ways[5][n]==1)cout<<"There is only 1 way to produce "<<n<<" cents change."<<endl;elsecout<<"There are "<<ways[5][n]<<" ways to produce "<<n<<" cents change."<<endl;}return0;}
http://www.gsyq.cn/news/1441712.html

相关文章:

  • 如何永久备份微信聊天记录:你的数字记忆守护指南
  • Arduino Uno驱动8个舵机:硬件连接、软件编程与电源管理全攻略
  • 别再为水质数据发愁了!用Python+LSTM搞定河流水质预测(附完整代码与数据集)
  • 原神帧率解锁终极指南:5分钟实现120帧丝滑体验
  • std::visit深入理解及源码分析
  • 电子织物手套:基于手势识别的创意交互系统设计与实现
  • 2026母线槽买什么牌子好?以半斤母线槽为例看口碑与排行 - 博客万
  • 游标码光电角度编码器原理教育八讲(五)
  • 2026年 七氟丙烷瓶头阀厂家推荐榜单:管网/单双柜/电磁/隔爆型与IG541/氮气/二氧化碳瓶头阀品牌解析 - 企业推荐官【官方】
  • 3大核心功能解锁Nintendo Switch潜能:大气层系统完整指南
  • 实测对比:YOLOv8n与YOLOv8m在Jetson Orin Nano上的训练速度与显存占用(附解决Killed进程方法)
  • Nacos 2.x 源码深度解析 (五):gRPC 推送链路 —— 配置变更下发与动态刷新
  • 2026 深圳财税公司商标注册五大评测,公司注册、代理记账、营业执照注销口碑排行 - 品牌智鉴榜
  • G-Helper终极指南:5分钟告别臃肿控制中心,释放华硕笔记本全部潜能
  • Layerdivider:3分钟快速分层神器,轻松将单张图片转为专业PSD文件
  • 2026年适合大件卖家的美国海外仓推荐:五家优选评测 - 科技焦点
  • 9款字重免费开源几何无衬线字体:如何为你的品牌找到完美的视觉语言?
  • 1分钟解锁B站缓存视频:m4s-converter如何让分离格式变通用MP4
  • 2026国内实木多层源头厂家怎么选?海华之家用硬实力和口碑告诉你答案 - 企业品牌优选推荐官
  • 如何用PyPortfolioOpt的Black-Litterman模型实现智能资产配置?终极指南
  • 石家庄珠宝首饰回收全集,各类配饰一站式回收变现 - 奢侈品回收测评
  • Locale Remulator深度解析:Windows系统区域模拟器的架构设计与技术实现
  • 2026 长沙翡翠回收:跳出 “种水” 单一认知,潮湿气候下的隐性折价与高货保值真相 - 奢侈品回收测评
  • 终极指南:如何使用Google OR-Tools解决复杂优化问题
  • 纪元黄金回收:台州人2026年5月卖金必读,足金K金铂金旧金回收价格与避坑全解析 - 余生黄金回收
  • 2026昆明装修公司推荐TOP10:别墅大宅、老房翻新、全案整装、高端定制全覆盖 - 资讯焦点
  • 重新定义智能电视媒体体验:Jellyfin Android TV客户端的革命性方案
  • ESP8266物联网语音控制实战:从MQTT到Google Home的智能设备开发
  • Sora 2工业设计合规性认证全路径(ISO/TS 16949 GB/T 19001-2023双标适配指南)
  • 如何为Windows桌面添加复古翻页时钟:FlipIt终极指南