1005 banknotes

来源:互联网 发布:淘宝客户维护方案 编辑:程序博客网 时间:2024/06/05 17:58

1005 Problem F

"Yakexi, this is the best age!" Dong MW works hard and get high pay, he has many 1 Jiao and 5 Jiao banknotes(纸币), some day he went to a bank and changes part of his money into 1 Yuan, 5 Yuan, 10 Yuan.(1 Yuan = 10 Jiao)

题意:对于给定价格的一本书,有大小不同面值的纸币,在不找零的情况下,所需要的纸币数量最少和最多分别是多少。

思路:在求解过程中,纸币最少则大面额的数量尽可能多,而纸币最多则小面额的数量尽可能多。

感想:需要逐层分析思考,在求解中,每一面值的纸币数量要多少,在这个问题上纠结了很长时间!

#include<iostream>

#include<string.h>

#include<algorithm>

#include<stdio.h>

using namespace std;

int min(int a[],int num[],int p,int s[]){

   int i,ans=0;

   for(i=5;i>1;i--){

       if(p>=num[i]*a[i]){

           ans+=num[i];

           p-=num[i]*a[i];

       }

       else{

           ans+=p/a[i];

           p%=a[i];

       }

    }

   if(p>num[1]) return -1;

   else  return ans+p;

}

int max(int a[],int num[],int p,int s[]){

   int i,ans=0;

   for(i=5;i>1;i--){

       if(p<=s[i-1]) continue;

       else{

           int k,j;

           j=(p-s[i-1])%a[i];

           if(j>0)

            k=((p-s[i-1])/a[i])+1;

           else   k=((p-s[i-1])/a[i]);

           ans+=k;

           p-=k*a[i];

       }

    }

   if(p>num[1]) return -1;

   else return ans+p;

}

void cm(int a[],int num[],int p)

{

   int i;

   int s[6]={0};

   s[1]=num[1];

       for(i=2;i<=5;i++)

           s[i]=s[i-1]+a[i]*num[i];

       int mmin,mmax;

       mmin=min(a,num,p,s);

       if(mmin==-1)  cout<<-1<<" "<<-1<<endl;

       else{

           mmax=max(a,num,p,s);

           if(mmax==-1)   cout<<-1<<""<<-1<<endl;

           else

                cout<<mmin<<""<<mmax<<endl;

    }

}

int main(){

   int sum,i,p,t;

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

   int num[6];

   cin>>t;

   while(t--){

       cin>>p;

       sum=0;

       for(i=1;i<6;i++){

                cin>>num[i];

                sum+=num[i]*a[i];

       }

       if(sum<p) cout<<-1<<" "<<-1<<endl;

       else  cm(a,num,p);

       }

       return 0;

}

0 0
原创粉丝点击