标签:des java os io for ar art 问题
该题意:给你一个价格,还有面值分别为1,5,10,50,100(单位:毛)纸币的数量,要你用最少数量的纸币和最多数量的凑出这个价格,输出最少和最多的数量。
最少的数量要用贪心的思想,优先取面值尽量大 的纸币来凑这个价格。
而最多的数量网上许多算法提供的方法多是用较小的纸币去补较大的纸币,这里提供另一种想法:因为我们要求的是花的最多数量纸币,所以就是要保证手上的纸币数量最少!!这样想的话问题就比较简单了,就转化为最少数量问题了。假设手上总共有p毛,而价格为q毛,我们用手上最少的数量的纸币去凑(p-q)毛,然后再用总数量减去该最少数量即可。
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
1
代码比较简陋,跟大家分享想法为主:
#include "stdio.h"
#include "string.h"
int b[10]={0,1,5,10,50,100};
int main()
{
int t;
int p,r;
int a[10],c[10],e[10];
int i,j,k,sum;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&p);
r=p;
for(i=1;i<=5;i++)
{
scanf("%d",&a[i]);
sum=sum+b[i]*a[i];
}
for(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(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])));
}
}
}
}
标签:des java os io for ar art 问题
原文地址:http://www.cnblogs.com/der5820/p/3907645.html