oxx 和 xjj 决定和小伙伴们一同坐船前往 Xiamen。去 Xiamen 的船票一张 p 元。
当他们满怀兴致地来到港口时发现居然只有不设找零的自动售票机,只能使用一元,五元,十元,二十元,五十元,一百元的纸币,且一次至多买 k 张船票。因此他们不得不去银行取钱。而 oxx 是个大懒人,他希望取的纸币数量越少越好,因此他想知道他们一行 n 人要都买到票至少需要取多少张纸币。
Input
第一行三个整数 n,k,p (1≤n≤103,1≤k≤10,1≤p≤103) 分别表示 oxx 需要购买船票张数,一次至多买船票数量,单张船票价格。
Output
输出一个整数,表示 oxx 至少要取多少张纸币。
Examples
1 1 9
5
9 5 17
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;
}