<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben)]]></title><description><![CDATA[<p>Hallo, ich fange gerade an C++ zu lernen und wollte mir selbst ein paar interessante Aufgaben stellen. Dabei habe ich folgende Knobelaufgabe gesehen:</p>
<pre><code>In den USA wählen 538 Wahlmänner den jeweiligen Präsidenten. Diese
Wahlmänner sind wie folgt auf die 51 Staaten verteilt:
Alabama 9
Alaska 3
usw...

Es ist die Frage zu klären, ob eine Stimmengleichheit bei der Wahl möglich ist.
Annahme: In jedem der Staaten setzt sich wie leider üblich entweder der
Kandidat der Republikaner oder jener der Demokraten durch.
</code></pre>
<p>Jetzt habe ich ein Programm geschrieben, dass auch wunderbar funktioniert. Allerdings wird es mir nie ein Ergebnis sagen können, da die &quot;Berechnung&quot; viel zu lange dauert (Permutation von 51 Elementen). Kann ich die Performance meines Programmes so verbessern, dass das Ergebnis in relativ kurzer Zeit ausgegeben wird? Oder muss ich den Algorithmus ändern? Wenn ja, wie? Hier mein Programm (ich hoffe, ihr versteht mein Programm. In stilistischer Hinsicht habe ich wenig Erfahrung mit Programmierung. Wäre also über jeden Tipp dankbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> )</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;

int main()
{
    const unsigned int staaten = 51; //Anzahl Staaten der Usa

    //Wahlmännder pro Staat (nach Staaten alphabetisch sortiert)
    unsigned int arr[staaten] = {9,3,7,6,47,8,8,3,21,12,4,4,24,12,8,7,9,10,4,10,13,20,10,7,11,4,5,4,4,16,5,36,13,3,23,8,7,25,4,8,3,11,29,5,3,12,10,3,6,11,3};

    unsigned int *beg (arr); //pointer auf beginn des arrays
    unsigned int *end (beg+staaten); //pointer hinter das ende des arrays

    std::sort(beg, end);

    do
    {
        for(unsigned int* a(beg);a!=end;++a) //hier wird entschieden, wie viele staaten die republikander gewonnen haben
        {
            size_t republikaner (0), demokraten (0);

            for(unsigned int *b(beg); b!=a; ++b)
                republikaner+=*b; //alle stimmen der republikander zusammen zählen
            for(unsigned int *b(a);b!=end;++b)
                demokraten+=*b; //alle stimmen der demokraten zusammen zählen

            if(republikaner == demokraten)
            {
                std::cout&lt;&lt;&quot;Unentschieden moeglich! :)&quot;;
            }
        }
    }
    while ( std::next_permutation (beg, end) ); //alle permutationen der wahlmänner

    std::cout&lt;&lt;&quot;Unentschieden unmoeglich! :(&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/248304/frage-zu-knobelaufgaben-algorithmus-kann-es-in-den-usa-wahlen-ein-unentschieden-geben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 02:34:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248304.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Aug 2009 02:10:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Sun, 23 Aug 2009 02:10:11 GMT]]></title><description><![CDATA[<p>Hallo, ich fange gerade an C++ zu lernen und wollte mir selbst ein paar interessante Aufgaben stellen. Dabei habe ich folgende Knobelaufgabe gesehen:</p>
<pre><code>In den USA wählen 538 Wahlmänner den jeweiligen Präsidenten. Diese
Wahlmänner sind wie folgt auf die 51 Staaten verteilt:
Alabama 9
Alaska 3
usw...

Es ist die Frage zu klären, ob eine Stimmengleichheit bei der Wahl möglich ist.
Annahme: In jedem der Staaten setzt sich wie leider üblich entweder der
Kandidat der Republikaner oder jener der Demokraten durch.
</code></pre>
<p>Jetzt habe ich ein Programm geschrieben, dass auch wunderbar funktioniert. Allerdings wird es mir nie ein Ergebnis sagen können, da die &quot;Berechnung&quot; viel zu lange dauert (Permutation von 51 Elementen). Kann ich die Performance meines Programmes so verbessern, dass das Ergebnis in relativ kurzer Zeit ausgegeben wird? Oder muss ich den Algorithmus ändern? Wenn ja, wie? Hier mein Programm (ich hoffe, ihr versteht mein Programm. In stilistischer Hinsicht habe ich wenig Erfahrung mit Programmierung. Wäre also über jeden Tipp dankbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> )</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;

int main()
{
    const unsigned int staaten = 51; //Anzahl Staaten der Usa

    //Wahlmännder pro Staat (nach Staaten alphabetisch sortiert)
    unsigned int arr[staaten] = {9,3,7,6,47,8,8,3,21,12,4,4,24,12,8,7,9,10,4,10,13,20,10,7,11,4,5,4,4,16,5,36,13,3,23,8,7,25,4,8,3,11,29,5,3,12,10,3,6,11,3};

    unsigned int *beg (arr); //pointer auf beginn des arrays
    unsigned int *end (beg+staaten); //pointer hinter das ende des arrays

    std::sort(beg, end);

    do
    {
        for(unsigned int* a(beg);a!=end;++a) //hier wird entschieden, wie viele staaten die republikander gewonnen haben
        {
            size_t republikaner (0), demokraten (0);

            for(unsigned int *b(beg); b!=a; ++b)
                republikaner+=*b; //alle stimmen der republikander zusammen zählen
            for(unsigned int *b(a);b!=end;++b)
                demokraten+=*b; //alle stimmen der demokraten zusammen zählen

            if(republikaner == demokraten)
            {
                std::cout&lt;&lt;&quot;Unentschieden moeglich! :)&quot;;
            }
        }
    }
    while ( std::next_permutation (beg, end) ); //alle permutationen der wahlmänner

    std::cout&lt;&lt;&quot;Unentschieden unmoeglich! :(&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1765140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765140</guid><dc:creator><![CDATA[Knobler]]></dc:creator><pubDate>Sun, 23 Aug 2009 02:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Sun, 23 Aug 2009 04:20:34 GMT]]></title><description><![CDATA[<p>Wie funktioniert das Wahlsystem mit den Wahlmännern überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765147</guid><dc:creator><![CDATA[äh???]]></dc:creator><pubDate>Sun, 23 Aug 2009 04:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Sun, 23 Aug 2009 05:03:07 GMT]]></title><description><![CDATA[<p>Das erste was mir aufgefallen ist, ist dass du jedes mal die Stimmen der Demokraten und der Republikaner ausrechnest und miteinander vergleichst. Das könntest du dir sparen. Am Anfang die Hälfte der Gesamtstimmen ausrechnen und dann in jedem Durchlauf die Zahl der Demokraten damit vergleichen. Spart einige Rechnungen.</p>
<p>Ansonsten dürften die Permutationen das Problem sein. Die Anzahl der Permutationen ist 51 Fakultät, eine Zahl mit 66 Stellen. Zumal sind diese unnötig, da uns gar nicht genau interessiert, welcher Staat was wählt, und vor allem nicht die Reihenfolge. Was zählt ist, wieviele Staaten mit einer bestimmten Stimmzahl eine der beiden Partei wählen.</p>
<p>Nehmen wir als Beispiel die Staaten mit 4 Stimmen (7 Stück). Uns interessieren folgende Fälle: 0 Staaten wählen Demokraten, 1 Staaten wählen Demokraten ... 7 Staaten wählen Demokraten (Entspricht 0, 4, 8 ... Stimmen an Demokraten). Das sind 8 Fälle, statt 7! = 5040 bei Permutation.</p>
<p>Letztendlich bekommst du so eine lineare Gleichung: x*1 (Stimmen Staaten) + y*2 (Stimmen Staaten) ... = Hälfte der Stimmen. Wobei x = 0 bis Anzahl der Staaten mit einer Stimme etc.</p>
<p>Ich bin mir nur grad nicht sicher wie man das nun genau in C++ lösen könnte, wenn die Zahl der verschiedenen Stimmzahlen nicht vorher bekannt oder zumindest begrenzt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765148</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Sun, 23 Aug 2009 05:03:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Sun, 23 Aug 2009 08:03:49 GMT]]></title><description><![CDATA[<p>Rucksackproblem</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765165</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 23 Aug 2009 08:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Sun, 23 Aug 2009 11:18:30 GMT]]></title><description><![CDATA[<p>Ein paar Bemerkungen:</p>
<p>Zum Code:<br />
Ich weiß nicht, wie es den anderen geht, aber ich finde die &quot;direct initialization&quot; gegenüber der &quot;copy initialization&quot; recht unleserlich, also <code>int* foo(blah);</code> versus <code>int* foo = blah;</code> . Man kann sich die Zeigergeschichte auch ganz sparen, wenn man Indizes statt Zeiger verwendet.</p>
<p>Zum Problem:<br />
Dein Problem, welches Du zu lösen versuchst, ähnelt sehr stark dem <a href="http://de.wikipedia.org/wiki/Untermengensumme" rel="nofollow">Untermengensumme-Problem</a>. Allerdings kommen bei Dir einige Zahlen der &quot;Menge&quot; mehrfach vor. Aber ich denke, dass es dadurch nicht einfacher wird. Das Untermengensumme-Problem ist bekanntermaßen &quot;schwer&quot; zu lösen (im Sinne der Ausführungsgeschwindigkeit). Für kleine Probleme würde ich die <a href="http://de.wikipedia.org/wiki/Branch-and-Bound" rel="nofollow">Branch-and-Bound</a>-Methode verwenden. Du kannst ja mal testen, ob das bei n=51 noch zu einem Ergebnis führt <em>bevor</em> Du das Interesse am Problem verlierst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Edit: Ich habe es mal ausprobiert und bin auch zu einem Ergebnis gekommen -- bzw etwa 3.000.000 Ergebnisse pro Sekunde (Intel Core2 Duo, 2.4 GHz, nur einen Kern genutzt, 32bit Linux, GCC 4.3.3, -O3, mit Rekursion). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765167</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 23 Aug 2009 11:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Mon, 24 Aug 2009 09:44:13 GMT]]></title><description><![CDATA[<p>Seit wann gibt es in den USA 51 Staaten?<br />
Ist der Song &quot;51st state&quot; von New Model Army jetzt also Realität geworden? -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765687</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 24 Aug 2009 09:44:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Mon, 24 Aug 2009 10:11:37 GMT]]></title><description><![CDATA[<p>Gibt auch nur 50 Staaten, aber 51 Wahlgebiete (50 Staaten + Washington D.C.). Es kam mir auch komisch vor, deswegen hatte ich es gestern nachgeguckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765704</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 24 Aug 2009 10:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Knobelaufgaben-Algorithmus (kann es in den USA Wahlen ein Unentschieden geben) on Mon, 24 Aug 2009 11:59:04 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Rucksackproblem</p>
</blockquote>
<p>Fast, eigentlich ist es nur PARTITION: <a href="http://de.wikipedia.org/wiki/PARTITION" rel="nofollow">http://de.wikipedia.org/wiki/PARTITION</a><br />
Das Rucksackproblem hat zwei Kriterien: Wert und Gewicht. Aber der Hinweis ist trotzdem gut. Insbesondere dürfte der Ansatz mit dynamischer Programmierung hier die Laufzeit auf wenige Millisekunden drücken: <a href="http://de.wikipedia.org/wiki/Rucksackproblem#L.C3.B6sung_mittels_dynamischer_Programmierung" rel="nofollow">http://de.wikipedia.org/wiki/Rucksackproblem#L.C3.B6sung_mittels_dynamischer_Programmierung</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765773</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 24 Aug 2009 11:59:04 GMT</pubDate></item></channel></rss>