单点时限: 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;
}