विभाजित करें और खुश रहें। कौन विजेता भाग के बारे में परवाह करता है?


12

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

लेकिन मैं नहीं चाहता कि जब मेरा कंप्यूटर ऐसा कर सके तो मैं सारी मेहनत कर लूं। और आप भी नहीं। तो इस समस्या को हल करें ताकि अगली बार जब आपको अपनी पत्नियों के बीच उपहारों को विभाजित करने की आवश्यकता हो, तो आप जानते हैं कि यह आसान होगा।

इनपुट

(एन * 2) तत्वों की 1 सरणी जहां एन * 2 पहली पंक्ति में निर्दिष्ट है।
निम्नलिखित पंक्ति में सरणी के तत्व।

उत्पादन

एन तत्वों के 2 सरणी प्रत्येक ऐसे हैं:
अंतर का (सरणी 1 के तत्वों का योग) और (सरणी 2 के तत्वों का योग) 0 के जितना करीब हो।

उदाहरण

इनपुट

4
1 2 3 4 

उत्पादन

1 4
2 3
diff=0

अस्वीकरण : मेरी दो पत्नियां नहीं हैं। लेकिन जब मुझे बुरा लगता है, तो मैं दो पत्नियों की कल्पना करता हूं। और अचानक, मैं आभारी और खुश हूं कि मेरे पास केवल एक है। : डी


3
जैसा कि यह खड़ा है, "2 ए एन तत्व प्रत्येक" समूहों को आकार में भी समान होने के लिए मजबूर करता है। क्या यह इरादा है? इनपुट समूह के लिए पल में उदाहरण के लिए 1 1 1 1 1 5सही जवाब होगा 1 1 1| 1 1 5, जबकि 1 1 1 1 1| 5अधिक समझ में आता है।
शियोना

यह समस्या जुड़वाँ बच्चों और शायद अन्य बच्चों-नक्षत्रों पर भी लागू होती है। क्रिसमस आज ज्यादातर एक 'वह मेरे से अधिक है' घटना है ...
TheConstructor

1
@ सियोना, हाँ, समान आकार का इरादा है। @ TheConstructor, बच्चों में विभाजित होना उतना मज़ेदार नहीं है जितना कि दो पत्नियों में विभाजित करना। : D
rahulroy9202

टैग कोड-चुनौती के लिए एक उद्देश्य जीतने की कसौटी की आवश्यकता होती है। इसके अलावा, यह सबसे बड़ी उप समस्‍या से सम्‍बंधित है जो पहले यहां पूछी गई थी।
हावर्ड

@ कितनी राशि के अंतर को कम करने के लिए महत्वपूर्ण अंतर हैं: आपको दो समान आकार सूचियों (न केवल समान रूप से मूल्यवान) का निर्माण करने की आवश्यकता है, आपको सभी तत्वों का उपयोग करने की आवश्यकता है ...
TheConstructor

जवाबों:


4

जावा

इस समस्या को दो चरणों में हल करने की कोशिश की जा रही है:

  1. वर्तमान में छोटी सूची में सबसे बड़ी शेष को जोड़कर और दूसरे के बगल में दो समान आकार की सूचियों का निर्माण करें। दोहराएँ।
  2. मूल्य में अंतर को कम करने के लिए स्विच की जा सकने वाली दोनों सूचियों से आइटम की पहचान करें

इनपुट की तरह

8
1 2 3 4 5 6 7 8

चरण 1 के बाद पहले से ही हल है

2 3 5 8
1 4 6 7
diff=0

और इनपुट की तरह

6
1 4 5 6 7 8

दोनों चरणों की आवश्यकता होगी ताकि

1 5 8
4 6 7
diff=3

(एक के बाद एक) का परिणाम बन जाता है

1 6 8
4 5 7
diff=1

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

Ideone.com पर कार्यक्रम

import java.util.*;

/**
 * Created to solve http://codegolf.stackexchange.com/q/23461/16293 .
 */
public class EqualSums {

    public static void main(String[] args) {
        final Scanner s = new Scanner(System.in);
        // Read number of elements to divide
        final int count = s.nextInt();
        if (count % 2 == 1) {
            throw new IllegalStateException(count + " can not be divided by 2. Consider adding a 0 value.");
        }
        // Read the elements to divide
        final SortedList valueStack = new SortedList(count);
        for (int i = 0; i < count; i++) {
            valueStack.add(s.nextLong());
        }

        final SortedList targetOne = new SortedList(count / 2);
        final SortedList targetTwo = new SortedList(count / 2);
        // Divide elements into two groups
        addInPairs(targetOne, targetTwo, valueStack);
        // Try to ensure groups have equal value
        retaliate(targetOne, targetTwo);

        // Output result
        System.out.println(targetOne);
        System.out.println(targetTwo);
        System.out.println("diff=" + Math.abs(targetOne.getSum() - targetTwo.getSum()));
    }

    private static void addInPairs(SortedList targetOne, SortedList targetTwo, SortedList valueStack) {
        SortedList smallerTarget = targetOne;
        SortedList biggerTarget = targetTwo;
        while (!valueStack.isEmpty()) {
            // Add biggest remaining value to small target
            smallerTarget.add(valueStack.removeLast());

            // Add second biggest remaining value to big target
            biggerTarget.add(valueStack.removeLast());

            // Flip targets if roles have changed
            if (smallerTarget.getSum() > biggerTarget.getSum()) {
                final SortedList temp = smallerTarget;
                smallerTarget = biggerTarget;
                biggerTarget = temp;
            }
        }

    }

    private static void retaliate(SortedList targetOne, SortedList targetTwo) {
        long difference;
        boolean changed;
        outer:
        do {
            difference = Math.abs(targetOne.getSum() - targetTwo.getSum());
            if (difference == 0) {
                return;
            }
            changed = false;
            // Try to find two values, that reduce the difference by changing them between targets
            for (Long valueOne : targetOne) {
                for (Long valueTwo : targetTwo) {
                    final Long tempOne = targetOne.getSum() + valueTwo - valueOne;
                    final Long tempTwo = targetTwo.getSum() - valueTwo + valueOne;
                    if (Math.abs(tempOne - tempTwo) < difference) {
                        targetOne.remove(valueOne);
                        targetTwo.add(valueOne);
                        targetTwo.remove(valueTwo);
                        targetOne.add(valueTwo);
                        changed = true;
                        continue outer;
                    }
                }
            }
        } while (changed);
    }

    public static class SortedList extends AbstractList<Long> {

        private final ArrayList<Long> list;
        private long sum = 0;

        public SortedList(int count) {
            list = new ArrayList<>(count);
        }

        // the next functions access list-field directly
        @Override
        public Long get(int index) {
            return list.get(index);
        }

        @Override
        public boolean add(final Long t) {
            final int i = Collections.binarySearch(list, t);
            if (i < 0) {
                // No equal element present
                list.add(-i - 1, t);
            } else {
                list.add(afterLastEqual(i, t), t);
            }
            sum += t;
            return true;
        }

        @Override
        public Long remove(int index) {
            final Long old = list.remove(index);
            sum -= old;
            return old;
        }

        @Override
        public int size() {
            return list.size();
        }

        // the next functions access list-field only through the functions above this point
        // to ensure the sum is well kept

        public long getSum() {
            return sum;
        }

        private int afterLastEqual(final int start, Object o) {
            int found = start;
            while (found < size() && o.equals(get(found))) {
                found++;
            }
            return found;
        }

        private int beforeFirstEqual(final int start, final Object o) {
            int found = start;
            while (found >= 0 && o.equals(get(found))) {
                found--;
            }
            return found;
        }

        @Override
        public int indexOf(Object o) {
            try {
                final int i = Collections.binarySearch(this, (Long) o);
                if (i >= 0) {
                    return beforeFirstEqual(i, o) + 1;
                }
            } catch (ClassCastException e) {
                // Object was not instance of Long
            }
            return -1;
        }

        @Override
        public int lastIndexOf(Object o) {
            try {
                final int i = Collections.binarySearch(this, (Long) o);
                if (i >= 0) {
                    return afterLastEqual(i, o) - 1;
                }
            } catch (ClassCastException e) {
                // Object was not instance of Long
            }
            return -1;
        }

        @Override
        public boolean remove(Object o) {
            if (o == null) {
                return false;
            }
            final int i = indexOf(o);
            if (i >= 0) {
                remove(i);
                return true;
            }
            return false;
        }

        public Long removeLast() {
            return remove(size() - 1);
        }

        public Long removeFirst() {
            return remove(0);
        }

        @Override
        public String toString() {
            Iterator<Long> it = iterator();
            if (!it.hasNext()) {
                return "";
            }

            StringBuilder sb = new StringBuilder();
            for (; ; ) {
                Long e = it.next();
                sb.append(e);
                if (!it.hasNext()) {
                    return sb.toString();
                }
                sb.append(' ');
            }
        }
    }
}

3

ब्रेजलॉग 2

pᶠḍᵐ{+ᵐo-}ᵒh

इसे ऑनलाइन आज़माएं!

यह एक लोकप्रियता प्रतियोगिता है, लेकिन इसका मतलब यह नहीं है कि गोल्फ की भाषाएं एक खराब फिट हैं। (वास्तव में, मुझे जेली में उत्तर देना चाहिए था क्योंकि जेली उत्तर किसी कारण से अपवित्र संख्या प्राप्त करने की प्रवृत्ति रखते हैं, भले ही कोई भी उन्हें प्रस्तुत करता हो या वे कितने गोल्फ के खिलाड़ी हों, लेकिन ब्रेकीलॉग अधिक पठनीय है।)

हम इनपुट के सभी क्रमपरिवर्तन ( pᶠ), और प्रत्येक ( ) को दो समान टुकड़ों में विभाजित करके शुरू करते हैं ( यदि हम किसी कारण से दो से अधिक पत्नियां रखते हैं तो हम इसे एक सबस्क्रिप्ट दे सकते हैं)। फिर हम प्रत्येक {…}ᵒके योग ( +) हाफ को पूर्ण अंतर (यानी o-, "अंतर का आदेश दिया"), और उन अंतरों का उपयोग करके क्रम क्रम को परिभाषित करने के लिए विभाजन की अनुमति ( ) का आदेश देते हैं। सबसे अच्छा परिणाम पहले वाला है, इसलिए हम hपरिणाम प्राप्त करने के लिए सूची के प्रमुख को लेते हैं ।


2

मेथेमेटिका

इनपुट प्रपत्र

इनपुट स्ट्रिंग को STDIN के माध्यम से लिया जाना है। assetsपत्नियों (या जुड़वाँ) के बीच वितरित की जाने वाली राशियों को संदर्भित करता है। lengthसंपत्ति की संख्या है।

assets=ToExpression[Rest[s=StringSplit[input]]]
length=ToExpression[First[s]]

वर्तमान उद्देश्यों के लिए हम यह मानेंगे कि संपत्ति में पूर्णांक 20 से होते हैं।

assets=Range[20];
length=Length[Range[20]]

प्रसंस्करण

(* find all possible distributions to one wife; the other presumably gets the remaining assets *)
r=Subsets[assets,{length/2}];

(*order them according to the difference with respect to the total of half of the assets. 
Remove the first set of assets.  One wife will get these.*)
s=SortBy[r/.{{a__Integer}:> {{a},Abs[Tr[Range[20]/2]-Tr[{a}]]}},Last][[1]];

(*The other wife's assets will be the complement.  The difference is carried over from the sorting routine. *)
Grid[{{Grid[{s[[1]],Complement[assets,s[[1]]]}]},{"difference = "<>ToString[s[[2]]]}}]

R20


क्या वितरण अनुचित है? इसलिए, दूसरा चुनें।

@ कंस्ट्रक्टर नोट करता है कि पत्नी 2 इस तथ्य से लड़ सकती है कि पत्नी को सभी सबसे अच्छी संपत्ति मिली। तो पत्नी के लिए निम्नलिखित सभी "निष्पक्ष" (अंतर = सबसे कम अंतर) शेयरों का उत्पादन करता है; पत्नी 2 को शेष संपत्ति मिलती है; शून्य का अर्थ पत्नियों के लिए संपत्ति में अंतर को दर्शाता है। 20 के माध्यम से 1 भारित परिसंपत्तियों को वितरित करने के लिए 5448 तरीके हैं। केवल कुछ लाइनें प्रदर्शित की जाती हैं।

प्रारूप है

s=SortBy[r/.{{a__Integer}:> {{a},Abs[Tr[Range[20]/2]-Tr[{a}]]}},Last];
z=Cases[s,{_List,x_}/;x==s[[1,2]]];
Short[z,10]
Length[z]

{{{1,2,3,4,5,16,17,18,19,20}, 0}, {{1,2,3,4,6,15,17,18,19,20}, 0}, {{1,2,3,4,7,14,17,18,19,20}, 0}, {{1,2,3,4,7,15,16,18,19,20 }, 0}, {{1,2,3,4,8,13,17,18,19,20}, 0}, {{1,2,3,4,8,14,16,18,19 20}, 0}, {{1,2,3,4,8,15,16,17,19,20}, 0}, {{1,2,3,4,9,12,17,18 , 19,20}, 0}, {{1,2,3,4,9,13,16,18,19,20}, 0}, {{1,2,3,4,9,14,15 , 18,19,20}, 0}, {{1,2,3,4,9,14,16,17,19,20}, 0}, {{1,2,3,4,9,15 , 16,17,18,20}, 0}, {{1,2,3,4,10,11,17,18,19,20}, 0}, {{1,2,3,4,10 , 12,16,18,19,20}, 0}, << 5420 >>, {{5,6,7,8,9,11,13,14,15,17}, 0}, {{5 , 6,7,8,9,12,13,14,15,16}, 0}, {{5,6,7,8,10,11,12,13,14,19}, 0} { {} 5,6,7,8,10,11,12,13,15,18, 0}, {{5,6,7,8,10,11,12,13,16,17}, 0} {{5,6,7,8,10,11,12,14,15,17}, 0}, {{5,6,7,8,10,11,13,14,15,16}, 0}, {{5,6,7,9,10,11,12,13,14,18}, 0}, {{5,6,7,9,10,11,12,13,15,17 }, 0}, {{5,6,7,9,10,11,12,14,15,16}, 0}, {{5,6,8,9,10,11,12,13,14 , 17}, 0}, {{5,6,8,9,10,11,12,13,15,16}, 0}, {{5,7,8,9,10,11,12,13,14,16}, 0}, {{6,7,8,9,10,11,12,13,14,15}, 0}}

5448


पूर्व जमाव संपादन के बीच पाया जा सकता है। यह अधिक अक्षम है, जैसा कि इस पर निर्भर करता है Permutations


ऐसे कार्य के लिए मैथेमेटिका सुंदर लगती है। एक आखिरी बात यह है कि असली पत्नियां शायद बहस करेंगी क्योंकि 5 सबसे मूल्यवान सामान एक ढेर पर हैं। (हाँ, 1 से 20 के साथ, तर्क के लिए कमरे के बिना कोई समाधान नहीं है)
TheConstructor

@ आमतौर पर, संपत्ति को वितरित करने के लिए काफी कुछ तरीके हैं। मैंने कुछ तरीकों को एक परिशिष्ट में सूचीबद्ध किया है। नोट: केवल एक पत्नी की संपत्ति सूचीबद्ध हैं; दूसरे को पूरक मिलता है।
डेविड मार्क

यही कारण है कि मैं अपने जन्मजात ढेर बनाने के लिए चुनता हूं जैसा कि मैं करता हूं: इसलिए आमतौर पर दो सबसे मूल्यवान चीजें एक ही ढेर पर नहीं होती हैं। आपका प्रारंभिक समाधान साबित करता है कि 21 की राशि के साथ 10 जोड़े संख्याएं हैं; आप स्पष्ट रूप से लगातार जोड़े चुनते हैं।
द कंस्ट्रक्टर

हां, मैं आपके दृष्टिकोण के तर्क की सराहना करता हूं।
डेविड

2

जे

यदि आप घर पर साथ चलना चाहते हैं, तो इस लिंक पर सभी जे आदिम का एक धोखा पत्र है । याद रखें: जे आम तौर पर दाईं से बाईं ओर पढ़ा जाता है, इसलिए 3*2+1यह 7 है, 9 नहीं। प्रत्येक क्रिया (जे फंक्शन के लिए) या तो मोनैडिक है, इसलिए सामने की तरह f y, या डाइएडिक, इसलिए बीच की तरह x f y

N =: (". 1!:1 ] 1) % 2          NB. number of items per wife
S =: ". 1!:1 ] 1                NB. list of items to distribute

bins =: #: i. 2 ^ 2*N           NB. all binary strings of length 2n
even =: bins #~ N = +/"1 bins   NB. select those with row-sum 1

NB. all distributions of equal numbers of items to each wife
NB. resultant shape: a list of 2xN matrices
NB. this /. adverb is where all the magic happens, see below
dist =: even ]/."1 S

diff =: | -/"1 +/"1 dist        NB. difference in wives' values
idx  =: (i. <./) diff           NB. index of the lowest difference

1!:2&2 idx { dist               NB. print the winning distribution of items
1!:2&2 'diff=', idx { diff      NB. and the difference of that distribution

नोट्स और स्पष्टीकरण:

  • u/"फोल्ड uओवर" का अर्थ है , इसलिए सूची में प्रत्येक तत्व पर बाइनरी ऑपरेशन करें। उदाहरण के लिए: फोल्ड प्लस , या सम का+/ अर्थ है ; से कम है , तो इसका मतलब है कि गुना कम , या न्यूनतम<.<./

  • u"1इसका मतलब है " u1-आयामी कोशिकाओं पर प्रदर्शन ", यानी हर पंक्ति पर। आम तौर पर जम्मू में क्रियाएं या तो परमाणु हैं, या पूरे तर्क पर लागू होती हैं। यह दोनों तर्कों पर लागू होता है यदि क्रिया का उपयोग रंग-रूप से (दो तर्कों के साथ) किया जाता है। निम्नलिखित को धयान मे रखते हुए:

       i. 2 3        NB. just a 2x3 matrix of numbers
    0 1 2
    3 4 5
       +/   i. 2 3   NB. Sum the items
    3 5 7
       +/"1 i. 2 3   NB. Sum the items of each row
    3 12
    
  • #:एक क्रिया है जो एक संख्या को अपने बाइनरी प्रतिनिधित्व में विस्तारित करती है। जब आप इसे एक से अधिक तत्वों वाली सूची में उपयोग करते हैं, तो यह सभी संख्याओं को भी ठीक से संरेखित करेगा, जिससे #:i.2^nआपको लंबाई के हर बाइनरी स्ट्रिंग मिलेंगे n

  • /., जब डायडिकली उपयोग किया जाता है, तो कुंजी कहा जाता है । यह सूची के तत्वों को कुंजियों के रूप में बाईं ओर, और दाईं ओर के मानों के रूप में उपयोग करता है। यह मूल्यों के प्रत्येक समूह को एक साथ जोड़ता है जो एक कुंजी साझा करता है, और फिर उन पर कुछ ऑपरेशन करता है।

    के मामले में ]/., ऑपरेशन सिर्फ पहचान की क्रिया है, इसलिए पूरी तरह से कुछ भी विशेष नहीं हो रहा है, लेकिन /.हमारे लिए सूची को विभाजित करने वाले तथ्य महत्वपूर्ण बिट हैं। यही कारण है कि हम बाइनरी सूची बनाते हैं: ताकि प्रत्येक सूची ( "1) के लिए, हम सभी संभव तरीकों से पत्नियों के लिए उपहारों को विभाजित कर सकें।

  • 1!:1]1और 1!:2&2क्रमशः रीड-इन और राइट-आउट ऑपरेशन हैं। 1!:nभाग क्रिया है और अन्य नंबर फ़ाइल हैंडल है। 1में कंसोल है, 2कंसोल से बाहर है, और 3 4 5स्टडिन, स्टडआउट, और स्टेडर हैं। हम ".पढ़ते समय भी उपयोग करते हैं ताकि हम इनपुट स्ट्रिंग्स को संख्याओं में परिवर्तित कर सकें।


1
+1 को J और AT LEAST TRYING में उत्तर देने के लिए समझने योग्य बनाने के लिए।
लेवल रिवर सेंट

1

Clojure

(defn divide [n]
 (loop [lv [] rv [] d (reverse (sort n))]
  (if (empty? d)
   [lv rv]
   (if (> (reduce + lv) (reduce + rv))
     (if (>= (count lv ) (count rv))
       (recur lv (conj rv (first d)) (into [] (rest d)))
       (recur (conj lv (last d)) rv (pop d))) 
     (if (<= (count lv ) (count rv))
       (recur (conj lv (first d)) rv (into [] (rest d)) )
       (recur lv (conj rv (last d)) (pop d)))))))


 (defn display [[f s]]
   (println f)
   (println s)
   (println (str "Diff " (- (reduce + f) (reduce + s)))))

परीक्षा

 (->> 
 [5 1 89 36 2 -4 20 7]
 divide 
 display)


 =: [89 -4 1 2]
    [36 20 7 5]
    Diff 20

परिणाम सेट समान आकार का होना चाहिए और प्रत्येक सेट के अंदर के मूल्यों के बीच का अंतर मुद्रित किया जाना चाहिए। Ideone पर एक त्वरित परीक्षण के परिणामों को देखते हुए आप दोनों बिंदुओं को याद कर सकते हैं
TheConstructor

परिणाम प्रिंट करने के लिए प्रदर्शन विधि जोड़ें।
मामून

परिणाम सेट अब समान आकार
मैमुन

के लिए [1 4 5 6 7 8]अपने कार्यक्रम की गणना [8 5 4] [7 6 1] Diff 3जहां स्पष्ट रूप से 1 अस्तित्व की एक अंतर के साथ समाधान।
TheConstructor

1

Matlab

यहाँ मेरा समाधान है:

%input array
presents=zeros(2,8);
presents(1,1)=8; %number of presents
presents(2,:)=[1 2 7 4 5 3 2 8]; %list of presents

%calculate the cumulative sum of all permutations
%its all about the gift values
how_many=presents(1,1);
options=perms(presents(2,:);
subtotals=cumsum(options,2);

%find the first index where the difference between the two parts is minimal
%makes both wives happy!!
[~, double_happiness] = min(abs(sum(presents(2,:))/2-subtotals(:,how_many/2)));

%create the present lists for Jennifer and Kate :)
for_jennifer=options(double_happiness,1:how_many/2)
for_kate=options(double_happiness,how_many/2+1:end)

उदाहरण के लिए मेरे स्रोत कोड परिणाम में वर्तमान सूची:

for_jennifer =

     8     2     5     1


for_kate =

     4     7     2     3

जो दोनों 16 है।

अगर मैं अपना कोड गोल्फ करता हूं, जो कम मजेदार है, तो मुझे बहुत ही अनअप्रूव्ड 132 चार्ट मिलते हैं। को हराया ;)

function f(p);o=perms(p(:,2));s=cumsum(o,2);[~,d]=min(abs(sum(p(:,2))/2-s(:,p(1,1)/2)));a={o(d,1:p(1,1)/2);o(d,p(1,1)/2+1:end)};a{:}

इनपुट ऐरे को वर्गाकार होना चाहिए।
डेविड

नहीं, वर्ग नहीं? लेकिन अब मैं देख रहा हूं कि आइटमों की संख्या पहली पंक्ति में होनी चाहिए। मैं इसे बदल दूंगा।
mmumboss

0

पीएचपी

चेतावनी: बहुत गंदा कोड
यह इनपुट सरणी के हर संभव क्रमांकन की कोशिश करता है।

के लिए Ideone नमूना 4/1 2 3 4: http://ideone.com/gIi174

<?php
// Discard the first input line! It's useless :)
fgets(STDIN);
$numbers = explode(' ', rtrim(fgets(STDIN)));
$valuePerWife = array_sum($numbers) / 2;

// Taken from here: http://stackoverflow.com/a/13194803/603003
// Credits to dAngelov: http://stackoverflow.com/users/955185/dangelov
function pc_permute($items, $perms = array( )) {
    if (empty($items)) {
        $return = array($perms);
    }  else {
        $return = array();
        for ($i = count($items) - 1; $i >= 0; --$i) {
             $newitems = $items;
             $newperms = $perms;
         list($foo) = array_splice($newitems, $i, 1);
             array_unshift($newperms, $foo);
             $return = array_merge($return, pc_permute($newitems, $newperms));
         }
    }
    return $return;
}


foreach (pc_permute($numbers) as $permutation) {
    $sum = 0;
    $rest = [];

    for ($i=0; $i<count($permutation); $i++) {
        $sum += $permutation[$i];
        if ($sum == $valuePerWife) {
            $rest = array_slice($permutation, $i + 1);
            break;
        }
    }

    if (array_sum($rest) == $valuePerWife) {
        echo implode(' ', array_slice($permutation, 0, $i + 1)), "\n";
        echo implode(' ', array_slice($permutation, $i + 1)), "\n";
        echo 'diff=0';
        exit;
    }
}
exit('DIDNT FOUND ANY COMBINATION!');

0

अजगर:

import itertools as t
raw_input()
a=[int(i) for i in raw_input().split()]
a=list(t.permutations(a))
b=len(a[0])/2
c=[(d[b:],d[:b]) for d in a]
d=[abs(sum(d[b:])-sum(d[:b])) for d in a]
e=zip(d,c)
e.sort()
print " ".join([str(i) for i in e[0][1][0]])
print " ".join([str(i) for i in e[0][1][1]])
print "diff",e[0][0]

या थोड़ा गोल्फ:

import itertools as t
b=int(raw_input())/2
e=[(abs(sum(d[b:])-sum(d[:b])),(d[b:],d[:b])) for d in t.permutations([int(i) for i in raw_input().split()])]
e.sort()
f=e[0]
g=f[1]
print " ".join([str(i) for i in g[0]]),"\n"," ".join([str(i) for i in g[1]]),"\n","diff=",f[0]

या इससे भी अधिक गोल्फ की तरह, क्योंकि आधी लाइनें सिर्फ मेकअप है। (यह मानते हुए कि मैं केवल कच्चे आंतरिक सरणी को डंप कर सकता हूं, क्योंकि यह ऑप में निर्दिष्ट नहीं है) आप printइंटरैक्टिव शेल में (उदाहरण के लिए) दूर छोड़ सकते हैं , और यदि आप वास्तव में चाहते हैं तो एक [::-1](बहुत बाद में, [0]) जोड़ें अन्तिम।

import itertools as t
b=int(raw_input())/2
print sorted([(abs(sum(d[b:])-sum(d[:b])),(d[b:],d[:b])) for d in t.permutations([int(i) for i in raw_input().split()])])[0]

(परिणाम (0, ((1, 2, 7, 8), (3, 4, 5, 6))))

यह, हालांकि, सभी सकारात्मक संयोजनों को पूरा कर रहा है, और इसे दूरस्थ रूप से कुशल नहीं माना जाना चाहिए। हालाँकि, यदि सूची के समान लंबाई होने से कोई फर्क नहीं पड़ता है, तो यह भी काम करेगा (बड़े सरणियों पर):

raw_input()
a,b=[],[]
for i in sorted([int(i) for i in raw_input().split()])[::-1]:
    b.append(i)
    if sum(b)>sum(a): b,a=a,b
print a,b,abs(sum(b)-sum(a))

उदाहरण के लिए इस कोड के तहत, यह बमुश्किल एक अंतर के साथ चलता है: 500k पर 10 ^ 10 अधिकतम मूल्य बहुत अधिक नहीं है, इसलिए कहने के लिए। यह भी बहुत तेज़ है: जहाँ दूसरा कोड शायद एक साल से कम समय में खत्म नहीं होगा (और यह बहुत आशावादी है), यह लगभग आधे सेकंड में चलता है, भले ही आपका माइलेज अलग-अलग हो।

def raw_input():
    import random
    return " ".join([str(random.randint(1,10**10)) for _ in range(10000)])

raw_input()
a,b=[],[]
for i in sorted([int(i) for i in raw_input().split()])[::-1]:
    b.append(i)
    if sum(b)>sum(a): b,a=a,b
print a,b,abs(sum(b)-sum(a))

प्रश्न: यह सीडब्ल्यू पद क्यों है?
हाइपरएन्यूट्रीनो

0

साहित्य हास्केल

> import Data.List
> import Data.Function

मैंने इसे अलग करने के लिए सूची में मोनाद का उपयोग किया।

> divide []=return ([], [])
> divide (x:xs)=do
>   (w1, w2) <- divide xs
>   [(x:w1, w2), (w1, x:w2)]

फिर हम एक रेटर बनाते हैं।

> rating (w1, w2)=abs $ (sum w1) - (sum w2)

और फिर एक फ़ंक्शन जो अंतर को कम करेगा।

> best = minimumBy (compare `on` rating) . filter (\(x,y)->length x == length y)

और कुछ ऐसा जो उन सभी को जोड़ती है।

> bestDivison=best . divide

अगले एक पार्सर।

> parse::String->[Int]
> parse=fmap read . words

और एक आउटपुट फॉर्मेटर।

> output (w1,w2)=unlines [unwords (map show w1)
>                        , unwords ( map show w2)
>                        , "diff="++(show $ abs $ (sum w1) - (sum w2))]

और अब कार्यक्रम

> main = do
>   getLine --Ignored, I don't need the arrays length
>   input <- fmap parse getLine
>   putStrLn "" --For readability
>   putStrLn $ output $ bestDivison input

उदाहरण:

λ <*Main>: main
8
5 1 89 36 2 -4 20 7

5 36 20 7
1 89 2 -4
diff=20

परिणाम सेट समान आकार का होना चाहिए
TheConstructor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.