one , Change problem

Examples 1：

have 1 element ,5 element ,10 element ,20 element ,100 element ,200 There are an infinite number of yuan notes . Now pay with these banknotes X element , How many banknotes do you need at least .

X = 628

Best payment method ：

3 Zhang 200 Block ,1 Zhang 20 Block ,1 Zhang 5 Block ,3 Zhang 1 Block

Common demand 3+1+1+3 = 8 Zhang

Intuition tells us : Use banknotes with larger denominations as much as possible !

Greedy : Follow a certain law , Algorithm design method of greedy selection of current optimal strategy .

analysis ： Denomination is 1 element ,5 element ,10 element ,20 element ,100 element ,200 element , Any denomination is a multiple of a denomination smaller than itself .
So when you use a larger bill , If it is replaced with notes of smaller denomination , More bills of other denominations must be needed !

code implementation ：

#include

#include

using namespace std;

int main(){

const int RMB[]= {200,100,20,10,5,1};

const int NUM = 6;//6 Species face value

int X = 628;

int count = 0;

for(int i= 0;i< NUM;i++){

int use = X / RMB[i]; Denomination required RMB[i] of use Zhang

count + = use;

X = X -RMB[i] * use;

printf(" Denomination required %d of %d Zhang ",RMB[i],use);

printf(" Remaining amount to be paid %d.\n",X);

}

printf(" Total required %d Zhang \n",count);

return 0;

}

Why? It must be right ?

Denomination is 1 element ,5 element ,10 element ,20 element ,100 element ,200 element , Any denomination is a multiple of a denomination smaller than itself .

So when you use a larger bill , If smaller denomination notes are used for replacement , More bills of other denominations must be needed .

for example ：

5=1+1+1+1+1

10=5+5

20=10+10

100=20+20+20+20+20

200=100+100

so ： The current optimal solution is the global optimal solution , Greedy establishment .

Examples 2：

have 1 element ,5 element ,6 Yuan note , Now pay with these bills K element , How many notes at least ?

After our analysis , This situation is not suitable for greedy algorithm , Because the greedy strategy we provided above is not the optimal solution . such as , To pay 10 Yuan words , According to the above algorithm , At least 1 Zhang 6 Meta ,4 Zhang 1 Meta , In fact, the best should be 2 Zhang 5 Meta .

Examples 3： hypothesis 1 element ,2 element ,5 element ,10 element ,20 element ,50 element ,100 The notes of yuan are a,b,c,d,e,f,g Zhang . Now we have to pay with this money m element , At least how many notes should I use ? If you can pay, output the minimum number of sheets paid , If you can't pay , output -1.

#include

#include

using namespace std;

const int N=7;

int Count[N]={3,0,2,1,0,3,5}; // Quantity of each denomination

int Value[N]={1,2,5,10,20,50,100}; // face value

int solve(int money)

{

int num=0;

for(int i=N-1;i>=0;i--)

{

int c=min(money/Value[i],Count[i]);

money=money-c*Value[i];

num+=c;

}

if(money>0) num=-1;

return num;

}

int main()

{

int money;

cin>>money;

int res=solve(money);

if(res!=-1) cout<

else cout<

}

Think about it , If the number of notes with different denominations is limited , Can we use greedy algorithm directly .