贪心算法—Problem F

贪心算法—Problem F

题意

给你一个价格,还有面值分别为1,5,10,50,100(单位:毛)纸币的数量,要你用最少数量的纸币和最多数量的凑出这个价格,输出最少和最多的数量。如果凑不出来,输出"-1 -1"。

解题思路

最少的数量要用贪心的思想,优先取面值尽量大的纸币来凑这个价格。找最多的数量的纸币问题可以转化为手里剩余的纸币最少,所以,假设手上总共有money毛,而价格为p毛,我们用手上最少的数量的纸币去凑(money-p)毛,然后再用总数量减去该最少数量即可。

感想

把求最多和最少的纸币数量都转化为一种问题感觉简便很多,用几个循环凑数即可,这样使问题得到简化。

AC代码

#include<iostream>

using namespace std;

 

int main()

{

         int T,i,j;

         int p,r,k,money;

         int min,max;

         int a[]={1,5,10,50,100};

         int b[10],c[10],d[10];

         cin>>T;

         for(i=0;i<T;i++)

         {

                   money=0;

                   cin>>p;

                   for(j=0;j<5;j++)

                   {

                            cin>>b[j];

                            money+=a[j]*b[j];

                   }

                   r=p;

                   for(j=4;j>=0;j--)

       {

           if( (r/a[j]) < b[j] )

           {

                c[j]=r/a[j];

                r-=a[j]*c[j];

           }

           else

           {

                c[j]=b[j];

                r-=a[j]*c[j];

           }

       }

       if(r!=0)

       {

           cout<<"-1 -1"<<endl;

       }

                   else

       {

           k=money-p;

           for(j=4;j>=0;j--)

           {

                if( (k/a[j]) < b[j] )

                {

                    d[j]=k/a[j];

                    k-=a[j]*d[j];

                }

                else

                {

                    d[j]=b[j];

                    k-=d[j]*a[j];

               }

           }

           min=0;

           max=0;

           if(k==0)

           {

                    for(j=0;j<5;j++)

                    {

                              min+=c[j];

                                     }

                                     for(j=0;j<5;j++)

                                     {

                                               max+=(b[j]-d[j]);

                                     }

                                     cout<<min<<""<<max<<endl;

           } 

       }   

         }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值