EOJ Monthly 2018.2 (Good bye 2017)A1. 坑爹的售票机 (Easy)

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

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

Input

第一行三个整数 n,k,p (1n103,1k10,1p103) 分别表示 oxx 需要购买船票张数,一次至多买船票数量,单张船票价格。

Output

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

Examples

input
1 1 9
output
5
input
9 5 17
output
6

Note

样例二:

买三次3张17,每次一张50一张1,共6张。


怎么说呢,贪心策略吧,从大面值的开始,大面值的不行一次往下

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf=0x3f3f3f;
int d[100005],a[6]={100,50,20,10,5,1},b[10],f[1005];
int main()
{
    int n,k,p,i,j,maxn,m;
    scanf("%d%d%d",&n,&k,&p);
    memset(d,inf,sizeof(d));
    memset(f,inf,sizeof(f));
    d[0]=0;
    f[0]=0;
    m=k*p;
    for(i=0;i<6;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(j-a[i]>=0)
            d[j]=min(d[j],d[j-a[i]]+1);
        }
    }
    for(i=1;i<=k;i++)
        b[i]=d[i*p];
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(j-i>=0)
            {
                f[j]=min(f[j],f[j-i]+b[i]);
            }
        }
    }
    printf("%d\n",f[n]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值