Computer Science, asked by dhruvnandu8135, 1 year ago

You have a block of platinum that can be exchanged in your bank either for cash or for smaller blocks of platinum. if you exchange a block of m grams, you get three blocks of weight m/2, m/3 and m/4 grams each. you don't get any fractional part, as the division process rounds down the value. if you exchange the block of platinum for cash, you get m units of currency. you can do any number of exchanges for smaller blocks or currency. given the value of a block in grams as input, write a program that would print the largest possible currency value that you can receive as the output. assume that the maximum value of a block that can be given as an input is 1,000,000,000 grams and the minimum value is 2 grams. in c++

Answers

Answered by Anonymous
4

Hey there!




Here's is your code.


#include <stdio.h>

#include <stdlib.h>


int maxn (int a, int b);


int exchangeBlock (int m);


void printPartinion (int ptn[], int n);


int exchangePartinion (int ptn[], int n);


void generatePartinion (int n, int ptn[], int crsum, int cridx, int *mx);


int generate (int n);


 

int

maxn (int a, int b)

{

 

return (a > b) ? a : b;


}



 

int

exchangeBlock (int m)

{

 

return m / 4 + m / 3 + m / 2;


}



 

void

printPartinion (int ptn[], int n)  

{

 

int i;

 

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

   

printf ("%d ", ptn[i]);

 

printf ("\n");


}



 

int

exchangePartinion (int ptn[], int n)  

{

 

int mx = 0;

 

int i = 0;

 

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

   

mx += exchangeBlock (ptn[i]);

 

return mx;


}



 

void

generatePartinion (int n, int ptn[], int crsum, int cridx, int *mx)  

{

 

int num;

 

 

if (n == 0)

   

return;

 

 

/* If current sum is equal to n, then we found a partinion */  

   if (crsum == n)

   {

     

printPartinion (ptn, cridx);

     

*mx = maxn (exchangePartinion (ptn, cridx), *mx);

     

printf ("__ %d\n", *mx);

   

}

 

 

/* Try placing all numbers from smallest to (n - current sum)

* at current index. The placed number must not be greater

* than previously placed numbers */  

   num = 1;

 

while (num <= n - crsum && (cridx == 0 || num <= ptn[cridx - 1]))

   {

     

ptn[cridx] = num;

     

generatePartinion (n, ptn, crsum + num, cridx + 1, mx);

     

num++;

   

}


}



 

int

generate (int n)  

{

 

int *ptn;   /* array to store partinions */

 

int mx = 0;   /* current largest currency */

 

ptn = (int *) malloc (n * sizeof (int));

 

generatePartinion (n, ptn, 0, 0, &mx);

 

return mx;


}



 

int

main ()

{

 

int grams = 0;

 

int exch = 0;

 

int bl = 0;

 

 

printf ("Input the value of the block in grams: ");

 

scanf ("%d", &grams);

 

 

if (grams > 1000000000 || grams < 2)

   

return 1;

 

 

/* Answer 1: */  

   printf ("\n");

 

exch = generate (grams);

 

printf ("\n%d - %d\n", grams, exch);

 

printf ("\nYou can get %d units of currency.\n", exch);

 

 

/* Answer 2: */  

   printf ("\n\n");

 

for (bl = 12; bl > 0; bl--)

   {

     

exch = exchangeBlock (bl);

     

printf ("%d - %d\n", bl, exch);

   

}

 

for (bl = 24; bl > 12; bl--)

   {

     

exch = exchangeBlock (bl);

     

printf ("%d - %d\n", bl, exch - 13);

   

}

 

exch = (grams / 12) * 13 + exchangeBlock ((grams + 12) % 12);

 

printf ("\nYou can get %d units of currency.\n", exch);

 

return 0;

}


______________________________

See the attachment for proper review.

______________________________

Attachments:
Similar questions