En az N iyi sayıya sahip olmak için oynamak için en az piyango bileti oluşturun


11

Bu oldukça karmaşık ama çok ilginç bir matematik dersi ( "örtme problemi" olarak bilinir ),

Ve bunu uygulamak için yardımınızı istiyorum.

Her bir biletin 50 sayıdan oluşan bir sette (1'den 50'ye kadar) 5 rastgele sayı seçmesi gereken bir piyango oyunu düşünün.

Kazanan bir bilet olasılığını veya 1, 2, 3 veya 4 iyi sayıya sahip olma olasılığını bilmek oldukça kolaydır.

1, 2, 3, 4 iyi sayıya sahip tüm biletleri "oluşturmak" da oldukça kolaydır.

Sorum (ve kod sorma) bununla ilgili, ancak biraz farklı:

Bazı piyango bileti almak istiyorum (mümkün olan en az), biletlerimden en az birinin 3 iyi numarası var.

Meydan okuma

Amacınız, herhangi bir dilde genel bir çözümü (bir program veya sadece bir işlev olarak) uygulamaktır:

// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)

Yukarıdaki örnek için, sadece aramak gerekir:

min_lottery_tickets(50, 5, 3)

ve program bu hedefe ulaşmak için en küçük bilet setini oluşturacak.


Misal:

 min_lottery_tickets(10, 5, 2)

7 bilet çıktı:

1   2   3   4   5
5   6   7   8   9
10  1   2   6   7
10  3   4   8   9
3   4   6   7   8
1   2   3   8   9
1   4   9   5   10

çünkü bu tür biletler 1'den 10'a kadar olan herhangi bir sayıyı karşılamak için yeterlidir.


Çıktı

Metin, bilet başına bir satır, sayılar arasındaki tablolar veya boşluklar


kim kazanır

En verimli program kazanır (yani yukarıdaki parametreler için en az bilet üreten program):

min_lottery_tickets(50, 5, 3)


Teşekkürler!



4
Bu sorunun çeşitli açıklamalara ihtiyacı var. Bir programın, bir fonksiyonun veya her ikisinin peşinde misiniz? Çıktı formatı önemli mi? Sayılar 1'den indekslenmeli mi yoksa 0'dan indekslenebiliyor mu? Peki nesnel kazanma koşulu nedir?
Peter Taylor

3
@xem bu neredeyse Math SE'ye ait. Muhtemelen size sayıların sizin lehinize olmadığını ispatlayacaklar (bilet satın almaya değer bazı ikramiye numarası olsa da)
Cruncher

2
Bir nedir iyi numara?
DavidC

2
Eminim ki böyle bir programın bilet çıkışını satın alırsanız çok para kaybedersiniz.
Michael Hampton

Yanıtlar:


1

Bunun optimal olmadığını biliyorum , ama burada node.js kodu:

function min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want) {
    c(function(result) {
        var other = result[result.length - 1];
        while (result.length < how_many_numbers_to_choose) {
            other++;
            var already = false;
            for (var i = 0; i < result.length; i++) {
                if (other === result[i]) {
                    already = true;
                    break;
                }
            }
            if (!already) {
                result.push(other);            
            }
        }
        if (other <= total_numbers_to_choose_from) {
            // Print results
            console.log(result);
        }
    }, total_numbers_to_choose_from, how_many_good_numbers_i_want);
}

function c(next, total_numbers, length, start, results) {
    if (!start) start = 1;
    if (!results) results = [];

    for (var i = start; i <= total_numbers + 1 - length; i++) {
        var resultsNew = results.slice(0);
        resultsNew.push(i);
        if (length > 1) {
            c(next, total_numbers, length - 1, i + 1, resultsNew);
        } else {
            next(resultsNew);
        }
    }
}

Bazı örnek sonuçlar:

> min_lottery_tickets(5, 3, 2)
[ 1, 2, 3 ]
[ 1, 3, 4 ]
[ 1, 4, 5 ]
[ 2, 3, 4 ]
[ 2, 4, 5 ]
[ 3, 4, 5 ]

diğer:

> min_lottery_tickets(10, 5, 2)
[ 1, 2, 3, 4, 5 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]

diğer:

> min_lottery_tickets(10, 5, 3)
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 4, 5, 6 ]
[ 1, 2, 5, 6, 7 ]
[ 1, 2, 6, 7, 8 ]
[ 1, 2, 7, 8, 9 ]
[ 1, 2, 8, 9, 10 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 3, 5, 6, 7 ]
[ 1, 3, 6, 7, 8 ]
[ 1, 3, 7, 8, 9 ]
[ 1, 3, 8, 9, 10 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 4, 6, 7, 8 ]
[ 1, 4, 7, 8, 9 ]
[ 1, 4, 8, 9, 10 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 5, 7, 8, 9 ]
[ 1, 5, 8, 9, 10 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 6, 8, 9, 10 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 3, 5, 6, 7 ]
[ 2, 3, 6, 7, 8 ]
[ 2, 3, 7, 8, 9 ]
[ 2, 3, 8, 9, 10 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 4, 6, 7, 8 ]
[ 2, 4, 7, 8, 9 ]
[ 2, 4, 8, 9, 10 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 5, 7, 8, 9 ]
[ 2, 5, 8, 9, 10 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 6, 8, 9, 10 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 4, 6, 7, 8 ]
[ 3, 4, 7, 8, 9 ]
[ 3, 4, 8, 9, 10 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 5, 7, 8, 9 ]
[ 3, 5, 8, 9, 10 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 6, 8, 9, 10 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 5, 7, 8, 9 ]
[ 4, 5, 8, 9, 10 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 6, 8, 9, 10 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 6, 8, 9, 10 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]

1
Sizin min_lottery_tickets(10, 5, 2)OP en çok daha fazla çözüm üretir.
Groo

@Groo'yu biliyorum, bunun optimal olmadığını bildiğimi söyledim, ama bu benim ilk çalışmamdı;) "Gereksiz" sonuçların nasıl kaldırılacağına dair herhangi bir öneriniz var mı?
Greuze

Merhaba Groo, Merhaba greuze, bu ilk girişim için çok teşekkürler. 21 puanınız var (çünkü (10,5,2) için 21 bilet oluşturdunuz). Ancak gereksiz sonuçları nasıl kaldıracağımı bilmiyorum, bu yüzden bu konuyu oluşturdum. Hala bu işi yapmak için en iyi algoritmanın neye benzediğini merak ediyorum.
xem

Konu ile ilgili bazı iyi okumalar: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem

1
NP-tam bir problem, bu yüzden korkarım sihirli bir çözüm yok. Mümkün olan tüm biletlerin hesaplanmasını ve sayı gruplarının her birini diğer tüm biletlerle karşılaştırarak gereksiz olanların ortadan kaldırılmasını "kaba kuvvet" etmek zorundayız. Bu üstel bir zaman alacaktır.
xem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.