简单题意
给出要花的钱,和手中已有的零钱,求出再不找零的情况下,用的零钱张数最多和最少的值
解题思路形成过程
本来想用暴力破解,编了两个都超时,没办法只好换了一个思路,先求最少数量的纸币,所以第一步贪心先去面值最大的纸币去凑价格,对于最多数量的问题可以转化为最少手中剩的纸币,用剩的钱的数目去凑剩下最少纸币数问题又转化为了第一个步骤。
感想
暴力破解尽量不用,要想更好的办法,问题的转化很重要
AC代码
#include <iostream>
#include <stdio.h>
using namespace std;
int b[10]={0,1,5,10,50,100};//ÃæÖµ
int main()
{
int t;
int p,r;
int a[10],c[10],e[10];//aÊýÁ¿£¬c½»¸¶µÄÁãÇ®£¬eʣϵÄÁãÇ®×îÉÙ
int k,sum;
scanf("%d",&t);
while(t--){
sum=0;
scanf("%d",&p);
r=p;
for(int i=1;i<=5;i++){
scanf("%d",&a[i]);
sum=sum+b[i]*a[i];
}
for(int i=5;i>0;i--){
if(r/b[i]<a[i]){
c[i]=r/b[i];
r=r-b[i]*c[i];
}else{
c[i]=a[i];
r=r-c[i]*b[i];
}
}
if(r!=0){
printf("-1 -1\n");
}else{
k=sum-p;
for(int i=5;i>0;i--){
if(k/b[i]<a[i]){
e[i]=k/b[i];
k=k-b[i]*e[i];
}else{
e[i]=a[i];
k=k-e[i]*b[i];
}
}
if(k==0){
printf("%d %d\n",c[1]+c[2]+c[3]+c[4]+c[5],(a[1]+a[2]+a[3]+a[4]+a[5]-(e[1]+e[2]+e[3]+e[4]+e[5])));
}
}
}
}