3507. 坑爹的售票机 (Easy)

单点时限: 1.0 sec

内存限制: 256 MB

oxx 和 xjj 决定和小伙伴们一同坐船前往 Xiamen。去 Xiamen 的船票一张 p 元。

当他们满怀兴致地来到港口时发现居然只有不设找零的自动售票机,只能使用一元,五元,十元,二十元,五十元,一百元的纸币,且一次至多买 k 张船票。因此他们不得不去银行取钱。而 oxx 是个大懒人,他希望取的纸币数量越少越好,因此他想知道他们一行 n 人要都买到票至少需要取多少张纸币。

输入格式
第一行三个整数 n,k,p (1≤n≤103,1≤k≤10,1≤p≤103) 分别表示 oxx 需要购买船票张数,一次至多买船票数量,单张船票价格。

输出格式
输出一个整数,表示 oxx 至少要取多少张纸币。

样例
input
1 1 9
output
5
input
9 5 17
output
6
提示
样例二:
买三次3张17,每次一张50一张1,共6张。
思路:costi]表示购买i张票的费用。转移方程为:cost[i]=max(cost[i],cost[i-j]+cost[j])。

#include<iostream>
using namespace std;
int flag[5]= {100,50,20,10,5};
long long f(long long n) {
	long long ans=0;
	for(int i = 0; i < 5; i++) {
		ans+=n/flag[i];
		n%=flag[i];
	}
	return ans+n;
}
int main() {
	long long n,k,p;
	cin>>n>>k>>p;
	long long ans=0;
	long long cost[n+1];
	fill(cost,cost+n+1,10000001);
	for(long long i = 1; i <= k; i++)
	cost[i]=f(i*p);
	for(int i = 2; i <= n; i++)
	{
		for(int j = 1; j < i; j++)
		cost[i]=min(cost[i],cost[i-j]+cost[j]);
	}
	cout<<cost[n];
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值