程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 3348 (數學+貪心)

hdu 3348 (數學+貪心)

編輯:C++入門知識

 


/*

 


分析:

求最少的紙幣數目時,直接用貪心就可以了;

求最多的紙幣數目時,要考慮用較小的紙幣來補較大的紙幣,只有這樣才能使數目最多,

但開始用小的補時,需要先找到滿足條件的最小紙幣總數對應的i值。。。

 


2013-04-22


*/

 

 

[cpp]
#include"stdio.h"  
#include"string.h"  
int min(int a[],int num[],int p,int sum[]) 

    int i; 
    int 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 sum[]) 

    int i; 
    int ans=0; 
    for(i=5;i>1;i--) 
    { 
        if(p<=sum[i-1])continue; 
        else 
        { 
            int t; 
            //先用滿足條件的最大面值,如果有余數,所用張數+1,  
            //不足的部分用較小面值的進行補  
            t=((p-sum[i-1])/a[i])+(((p-sum[i-1])%a[i])?1:0); 
            ans+=t; 
            p-=t*a[i]; 
        } 
    } 
    if(p>num[1])return -1; 
    else return ans+p; 

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

    int i; 
    int sum[6]={0}; 
    sum[1]=num[1]; 
    for(i=2;i<=5;i++) 
        sum[i]=sum[i-1]+a[i]*num[i]; 
    int mmin,mmax; 
    mmin=min(a,num,p,sum); 
    if(mmin==-1)printf("-1 -1\n"); 
    else 
    { 
        mmax=max(a,num,p,sum); 
        if(mmax==-1)printf("-1 -1\n"); 
        else 
            printf("%d %d\n",mmin,mmax); 
    } 

int main() 

    int a[6]={0,1,5,10,50,100}; 
    int i,p; 
    int num[6]; 
    int T; 
    scanf("%d",&T); 
    while(T--) 
    { 
        int sum; 
        sum=0; 
        scanf("%d",&p); 
        for(i=1;i<6;i++) 
        { 
            scanf("%d",&num[i]); 
            sum+=num[i]*a[i]; 
        } 
        if(sum<p)printf("-1 -1\n"); 
        else dp(a,num,p); 
    } 
    return 0; 

#include"stdio.h"
#include"string.h"
int min(int a[],int num[],int p,int sum[])
{
 int i;
 int 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 sum[])
{
 int i;
 int ans=0;
 for(i=5;i>1;i--)
 {
  if(p<=sum[i-1])continue;
  else
  {
   int t;
   //先用滿足條件的最大面值,如果有余數,所用張數+1,
   //不足的部分用較小面值的進行補
   t=((p-sum[i-1])/a[i])+(((p-sum[i-1])%a[i])?1:0);
   ans+=t;
   p-=t*a[i];
  }
 }
 if(p>num[1])return -1;
 else return ans+p;
}
void dp(int a[],int num[],int p)
{
 int i;
 int sum[6]={0};
 sum[1]=num[1];
 for(i=2;i<=5;i++)
  sum[i]=sum[i-1]+a[i]*num[i];
 int mmin,mmax;
 mmin=min(a,num,p,sum);
 if(mmin==-1)printf("-1 -1\n");
 else
 {
  mmax=max(a,num,p,sum);
  if(mmax==-1)printf("-1 -1\n");
  else
   printf("%d %d\n",mmin,mmax);
 }
}
int main()
{
 int a[6]={0,1,5,10,50,100};
 int i,p;
 int num[6];
 int T;
 scanf("%d",&T);
 while(T--)
 {
  int sum;
  sum=0;
  scanf("%d",&p);
  for(i=1;i<6;i++)
  {
   scanf("%d",&num[i]);
   sum+=num[i]*a[i];
  }
  if(sum<p)printf("-1 -1\n");
  else dp(a,num,p);
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved