कुछ डॉलर मूल्य दिए जाने पर सिक्कों के सभी संयोजन कैसे खोजें


114

मुझे कुछ महीनों पहले इंटरव्यू प्रस्तुत करने के लिए एक कोड मिला, जिसे मैं लिख रहा था।

मेरे पास जो टिप्पणी थी, उसके अनुसार यह इस समस्या को हल करने की कोशिश कर रहा था:

सेंट में कुछ डॉलर के मूल्य को देखते हुए (जैसे 200 = 2 डॉलर, 1000 = 10 डॉलर), सिक्कों के सभी संयोजन खोजें जो डॉलर के मूल्य को बनाते हैं। केवल पेनीज़ (1,), निकल (5,), डिम्स (10,), और क्वार्टर (25 arters) की अनुमति है।

उदाहरण के लिए, यदि 100 दिया गया था, तो उत्तर होना चाहिए:

4 quarter(s) 0 dime(s) 0 nickel(s) 0 pennies  
3 quarter(s) 1 dime(s) 0 nickel(s) 15 pennies  
etc.

मेरा मानना ​​है कि इसे पुनरावृत्त और पुनरावर्ती दोनों तरीकों से हल किया जा सकता है। मेरा पुनरावर्ती समाधान काफी छोटा है, और मैं सोच रहा था कि अन्य लोग इस समस्या को कैसे हल करेंगे। इस समस्या का कठिन हिस्सा इसे यथासंभव कुशल बना रहा था।


6
@ कप्पा: पैसा = 1 प्रतिशत; निकल = 5 सेंट; dime = 10 सेंट; क्वार्टर = 25
सेंटीमीटर

@ जॉन टी: कोड गोल्फ? मैंने उस शब्द के बारे में कभी नहीं सुना है! वैसे भी, मैं कुछ दिलचस्प जवाब देखने की उम्मीद कर रहा हूं, क्योंकि एसओ समुदाय किसी भी समस्या को हल कर सकता है
कोडिंगबियर

मैं एक बार घर आने के बाद अपना जवाब देने की कोशिश करूंगा ... अभी भी काम पर हूं और मुझे एसओ पर ज्यादा समय नहीं देना चाहिए।
कोडिंगबियर

1
@blee कोड गोल्फ आपकी पसंद की प्रोग्रामिंग भाषा के साथ कम से कम वर्णों में एक समस्या को हल करने को संदर्भित करता है। यहाँ कुछ हैं जो इस वेबसाइट पर किए गए हैं: stackoverflow.com/search?q=code+golf
जॉन टी

जवाबों:


54

मैंने बहुत समय पहले एक बार इस पर ध्यान दिया था, और आप इस पर मेरे छोटे लेखन को पढ़ सकते हैं । यहां मैथमेटिका स्रोत है

जनरेटिंग फ़ंक्शंस का उपयोग करके, आप समस्या का एक बंद-रूप निरंतर-स्थिर समाधान प्राप्त कर सकते हैं। ग्राहम, नुथ और पटाशनिक के ठोस गणित इसके लिए पुस्तक है, और इसमें समस्या की व्यापक चर्चा है। अनिवार्य रूप से आप एक बहुपद को परिभाषित करते हैं जहां n वें गुणांक n डॉलर के लिए परिवर्तन करने के तरीकों की संख्या है ।

राइटअप के पेज 4-5 बताते हैं कि आप कोड की तीन पंक्तियों में एक युगल सेकंड में 10 ^ 10 ^ 6 डॉलर के उत्तर की गणना करने के लिए मैथेमेटिका (या किसी अन्य सुविधाजनक कंप्यूटर बीजगणित प्रणाली) का उपयोग कैसे कर सकते हैं।

(और यह काफी पहले से था कि यह 75Mhz पेंटियम पर कुछ सेकंड है ...)


16
अच्छा जवाब, लेकिन मामूली सवाल: ध्यान दें कि (1) यह कई तरीकों से देता है, जबकि किसी कारण से प्रश्न सभी तरीकों के वास्तविक सेट के लिए पूछता है। बेशक, बहुपद के समय में सेट खोजने का कोई तरीका नहीं हो सकता है, क्योंकि आउटपुट में सुपरपोलीनोमियल रूप से कई प्रविष्टियां हैं (2) यह बहस का विषय है कि क्या एक जनरेटिंग फ़ंक्शन एक "बंद रूप" है (देखें हर्बर्ट विलफ की अद्भुत पुस्तक जनरेटिंगफंक्शनोलॉजी : गणित। upenn.edu/~wilf/DownldGF.html ) और यदि आपका मतलब है (1 + n5) ^ n, तो गणना करने के लिए Ω (लॉग एन) समय लगता है, न कि निरंतर समय।
श्रीवत्सआर

गतिशील प्रोग्रामिंग के लिए कोमल परिचय। इसके अलावा, मैं पढ़ने के लिए एक दृश्य समस्या के साथ किसी को भी प्रोत्साहित करते हैं generatingfunctionology
कर्नल पैनिक

बहुत बहुत धन्यवाद एंड्रयू ... इस स्पष्टीकरण ने मुझे बहुत मदद की ... नीचे दिए गए स्कैला फ़ंक्शन को पोस्ट करना चाहिए .. क्या किसी को इसकी आवश्यकता होनी चाहिए
जयराम एस

1
मेरा मानना ​​है कि शुरुआत में प्रश्न को थोड़ा सुधार करने की आवश्यकता है क्योंकि यह पूछता है "... 1-, 10-, 25-, 50-, और 100-प्रतिशत सिक्कों का उपयोग करते हुए?" लेकिन फिर लिखने अप सेट को परिभाषित करता है aके डोमेन के रूप में fलेकिन a = {1,5,10,25,50,100}। 5- प्रतिशत सिक्कों की सूची में होना चाहिए। वरना राइट अप शानदार था, धन्यवाद!
rbrtl

@rbrtl वाह, आप सही कह रहे हैं, कि ध्यान देने के लिए धन्यवाद! मैं इसे अपडेट करूंगा ...
andrewdotn

42

नोट : यह केवल तरीकों की संख्या दिखाता है।

स्केल समारोह:

def countChange(money: Int, coins: List[Int]): Int =
  if (money == 0) 1
  else if (coins.isEmpty || money < 0) 0
  else countChange(money - coins.head, coins) + countChange(money, coins.tail)

1
क्या वास्तव में 0 को बदलने का एक तरीका है? मुझे लगता है कि ऐसा करने का कोई तरीका नहीं है।
ल्यूक

2
यह बहुपद समाधानों की संख्या से उपजा है n1 * coins(0) + n2 * coins(1) + ... + nN * coins(N-1) = money। तो संयोजनों के लिए money=0और coins=List(1,2,5,10)गणना (n1, n2, n3, n4)1 है और समाधान है (0, 0, 0, 0)
किर

3
मैं अपने सिर को इधर उधर नहीं लपेट सकता कि यह कार्यान्वयन क्यों काम करता है क्या कोई मुझे एल्गोरिथ्म के पीछे समझा सकता है?
एड्रियन लेमेयर

3
यह निश्चित रूप से अभ्यास 1 की समस्या का सटीक उत्तर है।
जस्टिन स्टैंडर्ड

मेरा मानना ​​है कि, अगर, money == 0लेकिन coins.isEmpty, इसे एक सोलन के रूप में नहीं गिना जाना चाहिए। इसलिए, अगर coins.isEmpty || money < 0हालत पहले के लिए ck'd है, तो अहंकार बेहतर परोसा जा सकता है ।
जुआनचिटो

26

मैं एक पुनरावर्ती समाधान का पक्ष लूंगा। आपके पास संप्रदायों की कुछ सूची है, यदि सबसे छोटा कोई भी शेष मुद्रा राशि को समान रूप से विभाजित कर सकता है, तो यह ठीक काम करना चाहिए।

असल में, आप सबसे बड़े से लेकर सबसे छोटे संप्रदायों में जाते हैं।
रिकर्सिवली,

  1. आपके पास भरने के लिए एक वर्तमान कुल है, और एक सबसे बड़ा संप्रदाय (1 से अधिक बाएं के साथ) है। यदि केवल 1 संप्रदाय बचा है, तो कुल भरने का एक ही तरीका है। आप अपने वर्तमान मूल्यवर्ग की 0 से k प्रतियों का उपयोग कर सकते हैं जैसे कि k * cur denomination <= कुल।
  2. 0 से k के लिए, फ़ंक्शन को संशोधित कुल और नए सबसे बड़े संप्रदाय के साथ कॉल करें।
  3. परिणाम 0 से k तक जोड़ें। कि कितने तरीकों से आप अपने कुल को वर्तमान मूल्यवर्ग से नीचे भर सकते हैं। इस नंबर को वापस करें।

यहाँ 200 सेंट के लिए आपकी बताई गई समस्या का मेरा अजगर संस्करण है। मुझे 1463 रास्ते मिले। यह संस्करण सभी संयोजनों और अंतिम गणना को प्रिंट करता है।

#!/usr/bin/python

# find the number of ways to reach a total with the given number of combinations

cents = 200
denominations = [25, 10, 5, 1]
names = {25: "quarter(s)", 10: "dime(s)", 5 : "nickel(s)", 1 : "pennies"}

def count_combs(left, i, comb, add):
    if add: comb.append(add)
    if left == 0 or (i+1) == len(denominations):
        if (i+1) == len(denominations) and left > 0:
           if left % denominations[i]:
               return 0
           comb.append( (left/denominations[i], demoninations[i]) )
           i += 1
        while i < len(denominations):
            comb.append( (0, denominations[i]) )
            i += 1
        print(" ".join("%d %s" % (n,names[c]) for (n,c) in comb))
        return 1
    cur = denominations[i]
    return sum(count_combs(left-x*cur, i+1, comb[:], (x,cur)) for x in range(0, int(left/cur)+1))

count_combs(cents, 0, [], None)

यह नहीं भागा, लेकिन अपने तर्क के माध्यम से जाने से, यह समझ में आता है :)
कोडिंगबियर

आप फ़ंक्शन की अंतिम दो पंक्तियों को "रिटर्न सम (count_combs (...) for ...)" के साथ बदल सकते हैं - इस तरह सूची बिल्कुल भी भौतिक नहीं हो जाती है। :)
निक जॉनसन

पारितोषिक के लिए धन्यवाद। मुझे कोड को कसने के तरीकों में हमेशा दिलचस्पी है।
लीफ जूल

2
के रूप में में चर्चा की एक और सवाल है, इस कोड गलत उत्पादन देते हैं की सूची जाएगा denominationsनहीं है 1अंतिम मान के रूप में। आप ifइसे ठीक करने के लिए अंतरतम ब्लॉक में थोड़ी मात्रा में कोड जोड़ सकते हैं (जैसा कि मैं अन्य प्रश्न के उत्तर में बताता हूं)।
ब्लकिंक्थ

12

स्केल समारोह:

def countChange(money: Int, coins: List[Int]): Int = {

def loop(money: Int, lcoins: List[Int], count: Int): Int = {
  // if there are no more coins or if we run out of money ... return 0 
  if ( lcoins.isEmpty || money < 0) 0
  else{
    if (money == 0 ) count + 1   
/* if the recursive subtraction leads to 0 money left - a prefect division hence return count +1 */
    else
/* keep iterating ... sum over money and the rest of the coins and money - the first item and the full set of coins left*/
      loop(money, lcoins.tail,count) + loop(money - lcoins.head,lcoins, count)
  }
}

val x = loop(money, coins, 0)
Console println x
x
}

धन्यवाद! यह एक महान शुरूआत है। लेकिन, मुझे लगता है कि यह विफल रहता है जब "पैसा" 0 होना शुरू होता है :)।
अकन

10

यहाँ समस्या को हल करने के लिए कुछ बिल्कुल सीधा C ++ कोड दिया गया है जो सभी संयोजनों को दिखाने के लिए कहता है।

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("usage: change amount-in-cents\n");
        return 1;
    }

    int total = atoi(argv[1]);

    printf("quarter\tdime\tnickle\tpenny\tto make %d\n", total);

    int combos = 0;

    for (int q = 0; q <= total / 25; q++)
    {
        int total_less_q = total - q * 25;
        for (int d = 0; d <= total_less_q / 10; d++)
        {
            int total_less_q_d = total_less_q - d * 10;
            for (int n = 0; n <= total_less_q_d / 5; n++)
            {
                int p = total_less_q_d - n * 5;
                printf("%d\t%d\t%d\t%d\n", q, d, n, p);
                combos++;
            }
        }
    }

    printf("%d combinations\n", combos);

    return 0;
}

लेकिन मैं संयोजनों की संख्या की गणना करने की उप समस्या के बारे में काफी चिंतित हूं। मुझे संदेह है कि इसके लिए एक बंद-रूप समीकरण है।


9
निश्चित रूप से यह C है, C ++ नहीं।
निखिल

1
@ जॉर्ज फिलिप्स यू समझा सकते हैं?
कोशिश कर रहा

मुझे लगता है कि यह बहुत सीधा है। मूल रूप से, यह विचार सभी तिमाहियों (0,1,2 .. अधिकतम का उपयोग करके) को पुन: व्यवस्थित करने के लिए है, और फिर प्रयुक्त तिमाहियों के आधार पर सभी अपराधों के माध्यम से पुनरावृति होती है,
पीटर ली

4
इस समाधान के लिए नकारात्मक पक्ष यह है: यदि 50-प्रतिशत, 100-प्रतिशत, 500-सेंट के सिक्के हैं, तो हमें 6-स्तरीय लूप का उपयोग करना होगा ...
पीटर ली

3
यह बहुत बुरा है, यदि आपके पास एक गतिशील संप्रदाय है या आप एक और संप्रदाय जोड़ना चाहते हैं तो यह काम नहीं करेगा।
शिंज़ोउ

7

उप समस्या एक विशिष्ट डायनेमिक प्रोग्रामिंग समस्या है।

/* Q: Given some dollar value in cents (e.g. 200 = 2 dollars, 1000 = 10 dollars),
      find the number of combinations of coins that make up the dollar value.
      There are only penny, nickel, dime, and quarter.
      (quarter = 25 cents, dime = 10 cents, nickel = 5 cents, penny = 1 cent) */
/* A:
Reference: http://andrew.neitsch.ca/publications/m496pres1.nb.pdf
f(n, k): number of ways of making change for n cents, using only the first
         k+1 types of coins.

          +- 0,                        n < 0 || k < 0
f(n, k) = |- 1,                        n == 0
          +- f(n, k-1) + f(n-C[k], k), else
 */

#include <iostream>
#include <vector>
using namespace std;

int C[] = {1, 5, 10, 25};

// Recursive: very slow, O(2^n)
int f(int n, int k)
{
    if (n < 0 || k < 0)
        return 0;

    if (n == 0)
        return 1;

    return f(n, k-1) + f(n-C[k], k); 
}

// Non-recursive: fast, but still O(nk)
int f_NonRec(int n, int k)
{
    vector<vector<int> > table(n+1, vector<int>(k+1, 1));

    for (int i = 0; i <= n; ++i)
    {
        for (int j = 0; j <= k; ++j)
        {
            if (i < 0 || j < 0) // Impossible, for illustration purpose
            {
                table[i][j] = 0;
            }
            else if (i == 0 || j == 0) // Very Important
            {
                table[i][j] = 1;
            }
            else
            {
                // The recursion. Be careful with the vector boundary
                table[i][j] = table[i][j-1] + 
                    (i < C[j] ? 0 : table[i-C[j]][j]);
            }
        }
    }

    return table[n][k];
}

int main()
{
    cout << f(100, 3) << ", " << f_NonRec(100, 3) << endl;
    cout << f(200, 3) << ", " << f_NonRec(200, 3) << endl;
    cout << f(1000, 3) << ", " << f_NonRec(1000, 3) << endl;

    return 0;
}

आपके डायनेमिक सॉल्यूशन के लिए k की लंबाई C माइनस 1. की होनी चाहिए। आप सी की वास्तविक लंबाई का समर्थन करने के लिए इसे आसानी से बदल सकते हैं
इदं

7

कोड इस समस्या को हल करने के लिए जावा का उपयोग कर रहा है और यह भी काम करता है ... बहुत अधिक छोरों के कारण यह विधि एक अच्छा विचार नहीं हो सकता है, लेकिन यह वास्तव में एक सीधा आगे का रास्ता है।

public class RepresentCents {

    public static int sum(int n) {

        int count = 0;
        for (int i = 0; i <= n / 25; i++) {
            for (int j = 0; j <= n / 10; j++) {
                for (int k = 0; k <= n / 5; k++) {
                    for (int l = 0; l <= n; l++) {
                        int v = i * 25 + j * 10 + k * 5 + l;
                        if (v == n) {
                            count++;
                        } else if (v > n) {
                            break;
                        }
                    }
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(sum(100));
    }
}

7

यह वास्तव में एक पुराना सवाल है, लेकिन मैं जावा में एक पुनरावर्ती समाधान के साथ आया था जो अन्य सभी की तुलना में छोटा लग रहा था, इसलिए यहां है:

 public static void printAll(int ind, int[] denom,int N,int[] vals){
    if(N==0){
        System.out.println(Arrays.toString(vals));
        return;
    }
    if(ind == (denom.length))return;             
    int currdenom = denom[ind];
    for(int i=0;i<=(N/currdenom);i++){
        vals[ind] = i;
        printAll(ind+1,denom,N-i*currdenom,vals);
    }
 }

सुधार:

  public static void printAllCents(int ind, int[] denom,int N,int[] vals){
        if(N==0){
            if(ind < denom.length) {
                for(int i=ind;i<denom.length;i++)
                    vals[i] = 0;
            }
            System.out.println(Arrays.toString(vals));
            return;
        }
        if(ind == (denom.length)) {
            vals[ind-1] = 0;
            return;             
        }

        int currdenom = denom[ind];
        for(int i=0;i<=(N/currdenom);i++){ 
                vals[ind] = i;
                printAllCents(ind+1,denom,N-i*currdenom,vals);
        }
     }

6

आइए C (i, J) को सेट J में मानों का उपयोग करके i cents बनाने के संयोजनों का सेट दें।

आप सी को इस प्रकार परिभाषित कर सकते हैं:

यहां छवि विवरण दर्ज करें

(पहला (J) एक नियत तरीके से लेता है से एक सेट का एक तत्व )

यदि आप संस्मरण का उपयोग करते हैं, तो यह एक बहुत ही पुनरावर्ती कार्य करता है ... और यथोचित रूप से कुशल;


हाँ, यह ("गतिशील प्रोग्रामिंग", एक अर्थ में) इष्टतम समाधान होने जा रहा है।
श्रीवत्सआर

आप सही हैं: J को एक सूची के रूप में लें और एक सेट के रूप में नहीं: तो पहले (J) आपके लिए पहला तत्व लाता है और J की पहली (J) आपको बाकी की सूची देता है।
एकप्पा

यह किस रूप में गणित है?
मुहम्मद उमर

5

अद्वितीय संयोजन समस्या को प्राप्त करने के लिए अर्ध-हैक - अवरोही क्रम:

$ मूल्य = [१,५,१०,२५]
all_combs को हराया (राशि, अंतिम) 
  1 लौटाएँ यदि योग == 0
  $ $ denoms.select {| d | d & le sum && d & le last} .inject (0) {| कुल, संप्रदाय |
           कुल + all_combs (योग-denom, denom)}
समाप्त

यह धीमी गति से चलेगा क्योंकि यह याद नहीं होगा, लेकिन आपको यह विचार मिलता है।


4
# short and sweet with O(n) table memory    

#include <iostream>
#include <vector>

int count( std::vector<int> s, int n )
{
  std::vector<int> table(n+1,0);

  table[0] = 1;
  for ( auto& k : s )
    for(int j=k; j<=n; ++j)
      table[j] += table[j-k];

  return table[n];
}

int main()
{
  std::cout <<  count({25, 10, 5, 1}, 100) << std::endl;
  return 0;
}

3

यह पायथन में मेरा जवाब है। यह पुनरावर्तन का उपयोग नहीं करता है:

def crossprod (list1, list2):
    output = 0
    for i in range(0,len(list1)):
        output += list1[i]*list2[i]

    return output

def breakit(target, coins):
    coinslimit = [(target / coins[i]) for i in range(0,len(coins))]
    count = 0
    temp = []
    for i in range(0,len(coins)):
        temp.append([j for j in range(0,coinslimit[i]+1)])


    r=[[]]
    for x in temp:
        t = []
        for y in x:
            for i in r:
                t.append(i+[y])
        r = t

    for targets in r:
        if crossprod(targets, coins) == target:
            print targets
            count +=1
    return count




if __name__ == "__main__":
    coins = [25,10,5,1]
    target = 78
    print breakit(target, coins)

उदाहरण आउटपुट

    ...
    1 ( 10 cents)  2 ( 5 cents)  58 ( 1 cents)  
    4 ( 5 cents)  58 ( 1 cents)  
    1 ( 10 cents)  1 ( 5 cents)  63 ( 1 cents)  
    3 ( 5 cents)  63 ( 1 cents)  
    1 ( 10 cents)  68 ( 1 cents)  
    2 ( 5 cents)  68 ( 1 cents)  
    1 ( 5 cents)  73 ( 1 cents)  
    78 ( 1 cents)  
    Number of solutions =  121

3
var countChange = function (money,coins) {
  function countChangeSub(money,coins,n) {
    if(money==0) return 1;
    if(money<0 || coins.length ==n) return 0;
    return countChangeSub(money-coins[n],coins,n) + countChangeSub(money,coins,n+1);
  }
  return countChangeSub(money,coins,0);
}

2

दोनों: उच्च से निम्न सभी संप्रदायों के माध्यम से पुनरावृत्ति, संप्रदाय का एक लें, पुनःप्राप्त कुल से घटाएं, फिर शेष पर पुनरावृत्ति करें (वर्तमान पुनरावृत्ति मूल्य के बराबर या कम होने के लिए avilable संप्रदायों को विवश करना।)


2

यदि मुद्रा प्रणाली इसे अनुमति देती है, तो एक साधारण लालची एल्गोरिथ्म जो संभवतया प्रत्येक सिक्के के रूप में लेता है, उच्चतम मूल्य मुद्रा के साथ शुरू होता है।

अन्यथा, गतिशील प्रोग्रामिंग को एक इष्टतम समाधान खोजने के लिए जल्दी से आवश्यक है क्योंकि यह समस्या अनिवार्य रूप से नैकपैक समस्या है

उदाहरण के लिए, यदि किसी मुद्रा प्रणाली में सिक्के हैं: {13, 8, 1}लालची समाधान 24 के लिए परिवर्तन करेगा {13, 8, 1, 1, 1}, लेकिन सही इष्टतम समाधान है{8, 8, 8}

संपादित करें: मैंने सोचा था कि हम एक डॉलर के लिए बदलाव करने के सभी तरीकों को सूचीबद्ध नहीं करते हुए, बेहतर तरीके से बदलाव कर रहे थे। मेरे हालिया साक्षात्कार ने पूछा कि बदलाव कैसे किया जाए तो मैं सवाल पढ़ने के लिए आगे बढ़ने से पहले कूद गया।


समस्या एक डॉलर के लिए जरूरी नहीं है - यह 2 या 23 हो सकती है, इसलिए आपका समाधान अभी भी एकमात्र सही है।
नील जी

2

मैं जानता हूं कि यह बहुत पुराना सवाल है। मैं उचित उत्तर के माध्यम से खोज कर रहा था और ऐसा कुछ भी नहीं पा रहा था जो सरल और संतोषजनक हो। मुझे कुछ समय लगा लेकिन कुछ नीचे करने में सक्षम था।

function denomination(coins, original_amount){
    var original_amount = original_amount;
    var original_best = [ ];

    for(var i=0;i<coins.length; i++){
      var amount = original_amount;
      var best = [ ];
      var tempBest = [ ]
      while(coins[i]<=amount){
        amount = amount - coins[i];
        best.push(coins[i]);
      }
      if(amount>0 && coins.length>1){
        tempBest = denomination(coins.slice(0,i).concat(coins.slice(i+1,coins.length)), amount);
        //best = best.concat(denomination(coins.splice(i,1), amount));
      }
      if(tempBest.length!=0 || (best.length!=0 && amount==0)){
        best = best.concat(tempBest);
        if(original_best.length==0 ){
          original_best = best
        }else if(original_best.length > best.length ){
          original_best = best;
        }  
      }
    }
    return original_best;  
  }
  denomination( [1,10,3,9] , 19 );

यह एक जावास्क्रिप्ट समाधान है और पुनरावृत्ति का उपयोग करता है।


यह समाधान केवल एक संप्रदाय पाता है। सवाल "सभी" संप्रदायों को खोजने का था।
हीनोब

2

स्काला प्रोग्रामिंग भाषा में मैं इसे इस तरह से करूंगा:

 def countChange(money: Int, coins: List[Int]): Int = {

       money match {
           case 0 => 1
           case x if x < 0 => 0
           case x if x >= 1 && coins.isEmpty => 0
           case _ => countChange(money, coins.tail) + countChange(money - coins.head, coins)

       }

  }

2

यह एक सरल पुनरावर्ती एल्गोरिथ्म है जो एक बिल लेता है, फिर एक छोटा बिल पुनरावर्ती लेता है जब तक कि यह राशि तक नहीं पहुंचता है, तब यह उसी मूल्यवर्ग का एक और बिल लेता है, और फिर से पुनरावृत्ति करता है। उदाहरण के लिए नमूना आउटपुट देखें।

var bills = new int[] { 100, 50, 20, 10, 5, 1 };

void PrintAllWaysToMakeChange(int sumSoFar, int minBill, string changeSoFar)
{
    for (int i = minBill; i < bills.Length; i++)
    {
        var change = changeSoFar;
        var sum = sumSoFar;

        while (sum > 0)
        {
            if (!string.IsNullOrEmpty(change)) change += " + ";
            change += bills[i];

            sum -= bills[i]; 
            if (sum > 0)
            {
                PrintAllWaysToMakeChange(sum, i + 1, change);
            }
        }

        if (sum == 0)
        {
            Console.WriteLine(change);
        }
    }
}

PrintAllWaysToMakeChange(15, 0, "");

निम्नलिखित प्रिंट करता है:

10 + 5
10 + 1 + 1 + 1 + 1 + 1
5 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
5 + 5 + 1 + 1 + 1 + 1 + 1
5 + 5 + 5
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1

1

दुह, मुझे अभी बेवकूफ लग रहा है। नीचे वहाँ एक अत्यधिक जटिल समाधान है, जो मैं की रक्षा करेंगे, क्योंकि यह है है एक समाधान, सब के बाद। एक सरल समाधान यह होगा:

// Generate a pretty string
val coinNames = List(("quarter", "quarters"), 
                     ("dime", "dimes"), 
                     ("nickel", "nickels"), 
                     ("penny", "pennies"))
def coinsString = 
  Function.tupled((quarters: Int, dimes: Int, nickels:Int, pennies: Int) => (
    List(quarters, dimes, nickels, pennies) 
    zip coinNames // join with names
    map (t => (if (t._1 != 1) (t._1, t._2._2) else (t._1, t._2._1))) // correct for number
    map (t => t._1 + " " + t._2) // qty name
    mkString " "
  ))

def allCombinations(amount: Int) = 
 (for{quarters <- 0 to (amount / 25)
      dimes <- 0 to ((amount - 25*quarters) / 10)
      nickels <- 0 to ((amount - 25*quarters - 10*dimes) / 5)
  } yield (quarters, dimes, nickels, amount - 25*quarters - 10*dimes - 5*nickels)
 ) map coinsString mkString "\n"

यहाँ अन्य समाधान है। यह समाधान इस अवलोकन पर आधारित है कि प्रत्येक सिक्का दूसरों का एक गुण है, इसलिए उन्हें उनके संदर्भ में दर्शाया जा सकता है।

// Just to make things a bit more readable, as these routines will access
// arrays a lot
val coinValues = List(25, 10, 5, 1)
val coinNames = List(("quarter", "quarters"), 
                     ("dime", "dimes"), 
                     ("nickel", "nickels"), 
                     ("penny", "pennies"))
val List(quarter, dime, nickel, penny) = coinValues.indices.toList


// Find the combination that uses the least amount of coins
def leastCoins(amount: Int): Array[Int] =
  ((List(amount) /: coinValues) {(list, coinValue) =>
    val currentAmount = list.head
    val numberOfCoins = currentAmount / coinValue
    val remainingAmount = currentAmount % coinValue
    remainingAmount :: numberOfCoins :: list.tail
  }).tail.reverse.toArray

// Helper function. Adjust a certain amount of coins by
// adding or subtracting coins of each type; this could
// be made to receive a list of adjustments, but for so
// few types of coins, it's not worth it.
def adjust(base: Array[Int], 
           quarters: Int, 
           dimes: Int, 
           nickels: Int, 
           pennies: Int): Array[Int] =
  Array(base(quarter) + quarters, 
        base(dime) + dimes, 
        base(nickel) + nickels, 
        base(penny) + pennies)

// We decrease the amount of quarters by one this way
def decreaseQuarter(base: Array[Int]): Array[Int] =
  adjust(base, -1, +2, +1, 0)

// Dimes are decreased this way
def decreaseDime(base: Array[Int]): Array[Int] =
  adjust(base, 0, -1, +2, 0)

// And here is how we decrease Nickels
def decreaseNickel(base: Array[Int]): Array[Int] =
  adjust(base, 0, 0, -1, +5)

// This will help us find the proper decrease function
val decrease = Map(quarter -> decreaseQuarter _,
                   dime -> decreaseDime _,
                   nickel -> decreaseNickel _)

// Given a base amount of coins of each type, and the type of coin,
// we'll produce a list of coin amounts for each quantity of that particular
// coin type, up to the "base" amount
def coinSpan(base: Array[Int], whichCoin: Int) = 
  (List(base) /: (0 until base(whichCoin)).toList) { (list, _) =>
    decrease(whichCoin)(list.head) :: list
  }

// Generate a pretty string
def coinsString(base: Array[Int]) = (
  base 
  zip coinNames // join with names
  map (t => (if (t._1 != 1) (t._1, t._2._2) else (t._1, t._2._1))) // correct for number
  map (t => t._1 + " " + t._2)
  mkString " "
)

// So, get a base amount, compute a list for all quarters variations of that base,
// then, for each combination, compute all variations of dimes, and then repeat
// for all variations of nickels.
def allCombinations(amount: Int) = {
  val base = leastCoins(amount)
  val allQuarters = coinSpan(base, quarter)
  val allDimes = allQuarters flatMap (base => coinSpan(base, dime))
  val allNickels = allDimes flatMap (base => coinSpan(base, nickel))
  allNickels map coinsString mkString "\n"
}

इसलिए, 37 सिक्कों के लिए, उदाहरण के लिए:

scala> println(allCombinations(37))
0 quarter 0 dimes 0 nickels 37 pennies
0 quarter 0 dimes 1 nickel 32 pennies
0 quarter 0 dimes 2 nickels 27 pennies
0 quarter 0 dimes 3 nickels 22 pennies
0 quarter 0 dimes 4 nickels 17 pennies
0 quarter 0 dimes 5 nickels 12 pennies
0 quarter 0 dimes 6 nickels 7 pennies
0 quarter 0 dimes 7 nickels 2 pennies
0 quarter 1 dime 0 nickels 27 pennies
0 quarter 1 dime 1 nickel 22 pennies
0 quarter 1 dime 2 nickels 17 pennies
0 quarter 1 dime 3 nickels 12 pennies
0 quarter 1 dime 4 nickels 7 pennies
0 quarter 1 dime 5 nickels 2 pennies
0 quarter 2 dimes 0 nickels 17 pennies
0 quarter 2 dimes 1 nickel 12 pennies
0 quarter 2 dimes 2 nickels 7 pennies
0 quarter 2 dimes 3 nickels 2 pennies
0 quarter 3 dimes 0 nickels 7 pennies
0 quarter 3 dimes 1 nickel 2 pennies
1 quarter 0 dimes 0 nickels 12 pennies
1 quarter 0 dimes 1 nickel 7 pennies
1 quarter 0 dimes 2 nickels 2 pennies
1 quarter 1 dime 0 nickels 2 pennies

1

मेरा यह ब्लॉग प्रविष्टि एक XKCD कॉमिक से आंकड़े के लिए इस समस्या को हल करता है । itemsतानाशाही और exactcostमूल्य के लिए एक सरल परिवर्तन आपकी समस्या के लिए सभी समाधान भी प्राप्त करेगा।

यदि समस्या उस परिवर्तन को खोजने की थी जो कम से कम लागत का उपयोग करता है, तो एक भोली लालची एल्गोरिथ्म जो उच्चतम मूल्य के सिक्के के रूप में उपयोग करता है, सिक्कों और लक्ष्य राशि के कुछ संयोजनों के लिए अच्छी तरह से विफल हो सकता है। उदाहरण के लिए यदि 1, 3 और 4 के मान वाले सिक्के हैं; और लक्ष्य राशि 6 ​​है तो लालची एल्गोरिथ्म मान 4, 1, और 1 के तीन सिक्कों का सुझाव दे सकता है जब यह देखना आसान हो जाता है कि आप मूल्य 3 में से प्रत्येक के दो सिक्कों का उपयोग कर सकते हैं।

  • धान।

1
public class Coins {

static int ac = 421;
static int bc = 311;
static int cc = 11;

static int target = 4000;

public static void main(String[] args) {


    method2();
}

  public static void method2(){
    //running time n^2

    int da = target/ac;
    int db = target/bc;     

    for(int i=0;i<=da;i++){         
        for(int j=0;j<=db;j++){             
            int rem = target-(i*ac+j*bc);               
            if(rem < 0){                    
                break;                  
            }else{                  
                if(rem%cc==0){                  
                    System.out.format("\n%d, %d, %d ---- %d + %d + %d = %d \n", i, j, rem/cc, i*ac, j*bc, (rem/cc)*cc, target);                     
                }                   
            }                   
        }           
    }       
}
 }

1

मुझे ऑयली द्वारा "पायथन फॉर डेटा एनालिसिस" पुस्तक में कोड का यह साफ टुकड़ा मिला। यह आलसी कार्यान्वयन और अंतर तुलना का उपयोग करता है और मुझे लगता है कि यह दशमलव के उपयोग से अन्य संप्रदायों के लिए संशोधित किया जा सकता है। मुझे बताओ कि यह आपके लिए कैसे काम करता है!

def make_change(amount, coins=[1, 5, 10, 25], hand=None):
 hand = [] if hand is None else hand
 if amount == 0:
 yield hand
 for coin in coins:
 # ensures we don't give too much change, and combinations are unique
 if coin > amount or (len(hand) > 0 and hand[-1] < coin):
 continue
 for result in make_change(amount - coin, coins=coins,
 hand=hand + [coin]):
 yield result


1

यह जीहान के जवाब का सुधार है। अनावश्यक छोरों का बड़ा सौदा तब आता है जब मूल्यवर्ग सिर्फ 1 प्रतिशत होता है।

यह सहज और गैर-पुनरावर्ती है।

    public static int Ways2PayNCents(int n)
    {
        int numberOfWays=0;
        int cent, nickel, dime, quarter;
        for (quarter = 0; quarter <= n/25; quarter++)
        {
            for (dime = 0; dime <= n/10; dime++)
            {
                for (nickel = 0; nickel <= n/5; nickel++)
                {
                    cent = n - (quarter * 25 + dime * 10 + nickel * 5);
                    if (cent >= 0)
                    {
                        numberOfWays += 1;
                        Console.WriteLine("{0},{1},{2},{3}", quarter, dime, nickel, cent);
                    }                   
                }
            }
        }
        return numberOfWays;            
    }

यू इस समाधान को सामान्य नहीं कर सकता है, इसलिए उदाहरण के लिए एक नया तत्व सामने आता है, जिसमें आपको लूप के लिए एक और जोड़ना होगा
सुमित कुमार साहा

1

सीधा जावा समाधान:

public static void main(String[] args) 
{    
    int[] denoms = {4,2,3,1};
    int[] vals = new int[denoms.length];
    int target = 6;
    printCombinations(0, denoms, target, vals);
}


public static void printCombinations(int index, int[] denom,int target, int[] vals)
{
  if(target==0)
  {
    System.out.println(Arrays.toString(vals));
    return;
  }
  if(index == denom.length) return;   
  int currDenom = denom[index];
  for(int i = 0; i*currDenom <= target;i++)
  {
    vals[index] = i;
    printCombinations(index+1, denom, target - i*currDenom, vals);
    vals[index] = 0;
  }
}

1
/*
* make a list of all distinct sets of coins of from the set of coins to
* sum up to the given target amount.
* Here the input set of coins is assumed yo be {1, 2, 4}, this set MUST
* have the coins sorted in ascending order.
* Outline of the algorithm:
* 
* Keep track of what the current coin is, say ccn; current number of coins
* in the partial solution, say k; current sum, say sum, obtained by adding
* ccn; sum sofar, say accsum:
*  1) Use ccn as long as it can be added without exceeding the target
*     a) if current sum equals target, add cc to solution coin set, increase
*     coin coin in the solution by 1, and print it and return
*     b) if current sum exceeds target, ccn can't be in the solution, so
*        return
*     c) if neither of the above, add current coin to partial solution,
*        increase k by 1 (number of coins in partial solution), and recuse
*  2) When current denomination can no longer be used, start using the
*     next higher denomination coins, just like in (1)
*  3) When all denominations have been used, we are done
*/

#include <iostream>
#include <cstdlib>

using namespace std;

// int num_calls = 0;
// int num_ways = 0;

void print(const int coins[], int n);

void combine_coins(
                   const int denoms[], // coins sorted in ascending order
                   int n,              // number of denominations
                   int target,         // target sum
                   int accsum,         // accumulated sum
                   int coins[],        // solution set, MUST equal
                                       // target / lowest denom coin
                   int k               // number of coins in coins[]
                  )
{

    int  ccn;   // current coin
    int  sum;   // current sum

    // ++num_calls;

    for (int i = 0; i < n; ++i) {
        /*
         * skip coins of lesser denomination: This is to be efficient
         * and also avoid generating duplicate sequences. What we need
         * is combinations and without this check we will generate
         * permutations.
         */
        if (k > 0 && denoms[i] < coins[k - 1])
            continue;   // skip coins of lesser denomination

        ccn = denoms[i];

        if ((sum = accsum + ccn) > target)
            return;     // no point trying higher denominations now


        if (sum == target) {
            // found yet another solution
            coins[k] = ccn;
            print(coins, k + 1);
            // ++num_ways;
            return;
        }

        coins[k] = ccn;
        combine_coins(denoms, n, target, sum, coins, k + 1);
    }
}

void print(const int coins[], int n)
{
    int s = 0;
    for (int i = 0; i < n; ++i) {
        cout << coins[i] << " ";
        s += coins[i];
    }
    cout << "\t = \t" << s << "\n";

}

int main(int argc, const char *argv[])
{

    int denoms[] = {1, 2, 4};
    int dsize = sizeof(denoms) / sizeof(denoms[0]);
    int target;

    if (argv[1])
        target = atoi(argv[1]);
    else
        target = 8;

    int *coins = new int[target];


    combine_coins(denoms, dsize, target, 0, coins, 0);

    // cout << "num calls = " << num_calls << ", num ways = " << num_ways << "\n";

    return 0;
}

1

यहां C # फ़ंक्शन है:

    public static void change(int money, List<int> coins, List<int> combination)
    {
        if(money < 0 || coins.Count == 0) return;
        if (money == 0)
        {
            Console.WriteLine((String.Join("; ", combination)));
            return;
        }

        List<int> copy = new List<int>(coins);
        copy.RemoveAt(0);
        change(money, copy, combination);

        combination = new List<int>(combination) { coins[0] };
        change(money - coins[0], coins, new List<int>(combination));
    }

इसे इस तरह उपयोग करें:

change(100, new List<int>() {5, 10, 25}, new List<int>());

यह प्रिंट करता है:

25; 25; 25; 25
10; 10; 10; 10; 10; 25; 25
10; 10; 10; 10; 10; 10; 10; 10; 10; 10
5; 10; 10; 25; 25; 25
5; 10; 10; 10; 10; 10; 10; 10; 25
5; 5; 10; 10; 10; 10; 25; 25
5; 5; 10; 10; 10; 10; 10; 10; 10; 10; 10
5; 5; 5; 10; 25; 25; 25
5; 5; 5; 10; 10; 10; 10; 10; 10; 25
5; 5; 5; 5; 10; 10; 10; 25; 25
5; 5; 5; 5; 10; 10; 10; 10; 10; 10; 10; 10
5; 5; 5; 5; 5; 25; 25; 25
5; 5; 5; 5; 5; 10; 10; 10; 10; 10; 25
5; 5; 5; 5; 5; 5; 10; 10; 25; 25
5; 5; 5; 5; 5; 5; 10; 10; 10; 10; 10; 10; 10
5; 5; 5; 5; 5; 5; 5; 10; 10; 10; 10; 25
5; 5; 5; 5; 5; 5; 5; 5; 10; 25; 25
5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 10; 10; 10; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 10; 25
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 25; 25
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 10; 10; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 25
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 10; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 25
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 25
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 10
5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5; 5

आउटपुट बहुत सुंदर है
आपको

1

पैसे के सभी संयोजनों को खोजने के लिए नीचे एक अजगर कार्यक्रम है। यह ऑर्डर (n) समय के साथ एक गतिशील प्रोग्रामिंग समाधान है। पैसा 1,5,10,25 है

हम पंक्ति पैसे 1 से पंक्ति पैसे 25 (4 पंक्तियों) तक पहुंचते हैं। पंक्ति धन 1 में वह संख्या होती है यदि हम केवल संयोजनों की संख्या की गणना में धन 1 मानते हैं। पंक्ति मनी 5 प्रत्येक कॉलम को उसी अंतिम पैसे के लिए पंक्ति मनी आर में ले जाता है और पिछली 5 गणना अपनी पंक्ति (वर्तमान स्थिति 5) में ले जाती है। पंक्ति 10 पैसे पंक्ति 5 का उपयोग करता है, जिसमें 1,5 दोनों के लिए मायने रखता है और पिछली 10 गणना (वर्तमान स्थिति 10) में जोड़ता है। पंक्ति मनी 25 पंक्ति धन 10 का उपयोग करता है, जिसमें पंक्ति धन 1,5,10 के लिए मायने रखता है और पिछले 25 गणना।

उदाहरण के लिए, संख्या [1] [१२] = संख्या [०] [१२] + संख्या [१] [(] (which = १२-५) जिसके परिणामस्वरूप ३ = १ + २; संख्या [३] [१२] = संख्या [२] [१२] + संख्या [३] [९] (-१३ = १२-२५) जिसके परिणाम ४ = ० + ४ हैं, क्योंकि -१३ ० से कम है।

def cntMoney(num):
    mSz = len(money)
    numbers = [[0]*(1+num) for _ in range(mSz)]
    for mI in range(mSz): numbers[mI][0] = 1
    for mI,m in enumerate(money):
        for i in range(1,num+1):
            numbers[mI][i] = numbers[mI][i-m] if i >= m else 0
            if mI != 0: numbers[mI][i] += numbers[mI-1][i]
        print('m,numbers',m,numbers[mI])
    return numbers[mSz-1][num]

money = [1,5,10,25]
    num = 12
    print('money,combinations',num,cntMoney(num))

output:    
('m,numbers', 1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
('m,numbers', 5, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3])
('m,numbers', 10, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 4])
('m,numbers', 25, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 4])
('money,combinations', 12, 4)

0

जावा समाधान

import java.util.Arrays;
import java.util.Scanner;


public class nCents {



public static void main(String[] args) {

    Scanner input=new Scanner(System.in);
    int cents=input.nextInt();
    int num_ways [][] =new int [5][cents+1];

    //putting in zeroes to offset
    int getCents[]={0 , 0 , 5 , 10 , 25};
    Arrays.fill(num_ways[0], 0);
    Arrays.fill(num_ways[1], 1);

    int current_cent=0;
    for(int i=2;i<num_ways.length;i++){

        current_cent=getCents[i];

        for(int j=1;j<num_ways[0].length;j++){
            if(j-current_cent>=0){
                if(j-current_cent==0){
                    num_ways[i][j]=num_ways[i-1][j]+1;
                }else{
                    num_ways[i][j]=num_ways[i][j-current_cent]+num_ways[i-1][j];
                }
            }else{
                num_ways[i][j]=num_ways[i-1][j];
            }


        }


    }



    System.out.println(num_ways[num_ways.length-1][num_ways[0].length-1]);

}

}


0

नीचे दिए गए जावा समाधान जो अलग-अलग संयोजनों को भी प्रिंट करेंगे। समझने में आसान। आइडिया है

5 राशि के लिए

उपाय है

    5 - 5(i) times 1 = 0
        if(sum = 0)
           print i times 1
    5 - 4(i) times 1 = 1
    5 - 3 times 1 = 2
        2 -  1(j) times 2 = 0
           if(sum = 0)
              print i times 1 and j times 2
    and so on......

यदि प्रत्येक लूप में शेष राशि संप्रदाय से कम है अर्थात यदि शेष राशि 1 2 से कम है, तो बस लूप को तोड़ दें

नीचे पूरा कोड

कृपया किसी भी गलती के मामले में मुझे सुधारें

public class CoinCombinbationSimple {
public static void main(String[] args) {
    int sum = 100000;
    printCombination(sum);
}

static void printCombination(int sum) {
    for (int i = sum; i >= 0; i--) {
        int sumCopy1 = sum - i * 1;
        if (sumCopy1 == 0) {
            System.out.println(i + " 1 coins");
        }
        for (int j = sumCopy1 / 2; j >= 0; j--) {
            int sumCopy2 = sumCopy1;
            if (sumCopy2 < 2) {
                break;
            }
            sumCopy2 = sumCopy1 - 2 * j;
            if (sumCopy2 == 0) {
                System.out.println(i + " 1 coins " + j + " 2 coins ");
            }
            for (int k = sumCopy2 / 5; k >= 0; k--) {
                int sumCopy3 = sumCopy2;
                if (sumCopy2 < 5) {
                    break;
                }
                sumCopy3 = sumCopy2 - 5 * k;
                if (sumCopy3 == 0) {
                    System.out.println(i + " 1 coins " + j + " 2 coins "
                            + k + " 5 coins");
                }
            }
        }
    }
}

}


0

यहाँ एक पायथन आधारित समाधान है जो पुनरावृत्ति के साथ-साथ संस्मरण का उपयोग करता है जिसके परिणामस्वरूप ओ (mxn) की जटिलता होती है

    def get_combinations_dynamic(self, amount, coins, memo):
    end_index = len(coins) - 1
    memo_key = str(amount)+'->'+str(coins)
    if memo_key in memo:
        return memo[memo_key]
    remaining_amount = amount
    if amount < 0:
        return []
    if amount == 0:
        return [[]]
    combinations = []
    if len(coins) <= 1:
        if amount % coins[0] == 0:
            combination = []
            for i in range(amount // coins[0]):
                combination.append(coins[0])
            list.sort(combination)
            if combination not in combinations:
                combinations.append(combination)
    else:
        k = 0
        while remaining_amount >= 0:
            sub_combinations = self.get_combinations_dynamic(remaining_amount, coins[:end_index], memo)
            for combination in sub_combinations:
                temp = combination[:]
                for i in range(k):
                    temp.append(coins[end_index])
                list.sort(temp)
                if temp not in combinations:
                    combinations.append(temp)
            k += 1
            remaining_amount -= coins[end_index]
    memo[memo_key] = combinations
    return combinations

ठीक है, मुझे संदेह है कि ऊपर बहुपदीय रन समय है। निश्चित नहीं है कि हमारे पास बहुपदीय भाग समय हो सकता है। लेकिन मैंने जो देखा है वह कई मामलों में गैर-संस्मरणित संस्करण की तुलना में तेजी से ऊपर है। मैं शोध करना जारी
रखूंगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.