The minimum number of coins the sum of which is S

后端 未结 12 1347
我寻月下人不归
我寻月下人不归 2020-11-30 05:06

Given a list of N coins, their values (V1, V2, ... , VN), and the total sum S. Find the minimum number of coins the sum of which is S (we can use as many coins of one type a

12条回答
  •  渐次进展
    2020-11-30 05:45

    The main idea is - for each coin j, value[j] <= i (i.e sum) we look at the minimum number of coins found for i-value[j] (let say m) sum (previously found). If m+1 is less than the minimum number of coins already found for current sum i then we update the number of coins in the array.

    For ex - sum = 11 n=3 and value[] = {1,3,5}
    Following is the output we get

    i- 1  mins[i] - 1  
    i- 2  mins[i] - 2  
    i- 3  mins[i] - 3  
    i- 3  mins[i] - 1  
    i- 4  mins[i] - 2  
    i- 5  mins[i] - 3  
    i- 5  mins[i] - 1  
    i- 6  mins[i] - 2  
    i- 7  mins[i] - 3  
    i- 8  mins[i] - 4  
    i- 8  mins[i] - 2  
    i- 9  mins[i] - 3  
    i- 10 mins[i] - 4  
    i- 10 mins[i] - 2  
    i- 11 mins[i] - 3 
    

    As we can observe for sum i = 3, 5, 8 and 10 we improve upon from our previous minimum in following ways -

    sum = 3, 3 (1+1+1) coins of 1 to one 3 value coin  
    sum = 5, 3 (3+1+1) coins to one 5 value coin  
    sum = 8, 4 (5+1+1+1) coins to 2 (5+3) coins  
    sum = 10, 4 (5+3+1+1) coins to 2 (5+5) coins.  
    

    So for sum=11 we will get answer as 3(5+5+1).

    Here is the code in C. Its similar to pseudocode given in topcoder page whose reference is provided in one of the answers above.

    int findDPMinCoins(int value[], int num, int sum)
    {
        int mins[sum+1];
        int i,j;
    
       for(i=1;i<=sum;i++)
           mins[i] = INT_MAX;
    
        mins[0] = 0;
        for(i=1;i<=sum;i++)
        {
            for(j=0;j

提交回复
热议问题