1062: 山东煎饼
Description
今天TheBeet去门口那家山东煎饼小摊买煎饼,到他付钱的时候他才发现,他的钱包里面只有一张100块。于是他需要把这张100块钱破开,但是TheBeet不喜欢硬币,另外由于某种原因,TheBeet也不喜欢20元的纸币,另外也不喜欢钱包里面有太多张纸币,所以他希望拿到尽量少的纸币数。给出摊主现有的纸币数量,求摊主要如何找零给TheBeet才能满足他的要求。
Input
输入的第一行是一个正整数N(1<=N<=40),表示TheBeet买了N个山东煎饼,已知每个山东煎饼价格为2.5元。
接下来有6个非负整数,范围在[0, 1000]之内,分别表示摊主所拥有的50元、10元、5元、1元、5角、1角纸币的数量。
Output
输出一个整数,表示TheBeet最后收到的纸币数。如果无法满足要求,那就输出-1。
Sample Input
2
100 100 100 100 100 100
Sample Output
6
HINT
最后TheBeet共收到50+10+10+10+10+5元钱。所以共6张纸币。
Source
这是找硬币(零钱)问题模型:给定一定面值,然后换成最少数量的较小面值组合。直接贪心:能选面值最大的就选,而且尽可能选多点。
代码:
#include<bits/stdc++.h>
using namespace std;
const int v[]={500,100,50,10,5,1};//化成角好处里些
int A[6];
int main(){
//freopen("in.txt","r",stdin);
int n;
while(cin>>n){
n*=25;
n=1000-n;
for(int i=0;i<6;i++)
scanf("%d",A+i);
int cnt=0;
for(int i=0;i<6 && n>0;i++){//贪心从最大面值开始取
int t=n/v[i];
if(t<=A[i]) cnt+=t,n=n%v[i];
else cnt+=A[i],n=n-A[i]*v[i];
}
if(n) printf("-1\n");//还有剩余则没有换取方式
else printf("%d\n",cnt);
}
return 0;
}

9925

被折叠的 条评论
为什么被折叠?



