这道题我们先来想一想:
在现实生活中,你去买东西,有找零钱找你100的吗??没有!!
那么我们可以试着从卖家出发考虑问题,把小于最大面值的所有情况枚举出来
int re[41][2]={ //第一个数表示找的零钱,第二个数表示需要的最少的硬币
{0,0},
{5,1},{10,1},{15,2},{20,1},{25,2},{30,2},{35,3},{40,2},
{45,3},{50,1},{55,2},{60,2},{65,3},{70,2},{75,3},{80,3},
{85,4},{90,3},{95,4},{100,1},
{105,2},{110,2},{115,3},{120,2},{125,3},{130,3},{135,4},{140,3},
{145,4},{150,2},{155,3},{160,3},{165,4},{170,3},{175,4},{180,4},
{185,5},{190,4},{195,5},{200,1},
};
然后加上商品的总额,然后再去和我有的钱进行比较,取最小的就是答案
代码如下: (简单粗暴)
#include<cstdio>
#include<cstdlib>
#include<set>
using namespace std;
set<int> it;
set<int> ::iterator p;
int cent[]={5,10,20,50,100,200};
int re[41][2]={
{0,0},
{5,1},{10,1},{15,2},{20,1},{25,2},{30,2},{35,3},{40,2},
{45,3},{50,1},{55,2},{60,2},{65,3},{70,2},{75,3},{80,3},
{85,4},{90,3},{95,4},{100,1},
{105,2},{110,2},{115,3},{120,2},{125,3},{130,3},{135,4},{140,3},
{145,4},{150,2},{155,3},{160,3},{165,4},{170,3},{175,4},{180,4},
{185,5},{190,4},{195,5},{200,1},
};
int cent_num[6];
int main()
{
int m,n;
int flag;
double mon;
int tol;
while(scanf("%d",&n)==1)
{
m=0;
flag=0;
cent_num[0]=n;
if(n==0)flag++;
for(int i=1;i<6;i++)
{
scanf("%d",&n);
cent_num[i]=n;
if(n==0)flag++;
}
if(flag==6)break;
scanf("%lf",&mon);
n=(int)(mon*100+0.5);//n为总钱数
for(int i=0;i<41;i++)
{
tol=0;
m=n+re[i][0];
for(int j=5;j>=0;j--)//从大到小开始
{
int k=cent_num[j];
while(k>0&&m-cent[j]>=0)
{
k--;
m-=cent[j];
tol++;
}
if(m==0)
{
tol+=re[i][1];
it.insert(tol);
}
}
}
p=it.begin();
printf("%3d\n",*p);
it.clear();
}
return 0;
}