Hasilkan tiket lotere paling sedikit untuk dimainkan agar memiliki setidaknya N angka bagus

11

Ini adalah pelajaran matematika yang agak rumit tapi sangat menarik (dikenal sebagai "meliput masalah" ),

Dan saya ingin bantuan Anda untuk mengimplementasikannya.

Bayangkan sebuah permainan lotere, di mana setiap tiket harus memilih 5 angka acak dalam satu set 50 angka (dari 1 hingga 50).

Sangat mudah untuk mengetahui probabilitas tiket yang menang, atau probabilitas untuk memiliki 1, 2, 3 atau 4 angka yang baik.

Juga cukup mudah untuk "menghasilkan" semua tiket yang memiliki angka 1, 2, 3, 4 yang baik.

Pertanyaan saya (dan tantangan kode) terkait dengan ini, tetapi sedikit berbeda:

Saya ingin membeli beberapa tiket lotre (sesedikit mungkin), seperti setidaknya satu tiket saya memiliki 3 angka bagus.

Tantangan

Tujuan Anda adalah untuk mengimplementasikan solusi umum (sebagai program atau hanya fungsi), seperti ini, dalam bahasa apa pun:

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

Untuk contoh di atas, seseorang hanya perlu menelepon:

min_lottery_tickets(50, 5, 3)

dan program akan menghasilkan set tiket terkecil untuk dimainkan untuk mencapai tujuan ini.


Contoh:

 min_lottery_tickets(10, 5, 2)

akan menghasilkan 7 tiket, seperti yang:

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

karena tiket semacam itu cukup untuk mencakup sepasang nomor dari 1 hingga 10.


Keluaran

Teks, satu baris per tiket, tabulasi atau spasi antar angka


yang menang

Program yang paling efisien menang (yaitu program yang menghasilkan tiket paling sedikit untuk parameter di atas):

min_lottery_tickets(50, 5, 3)


Terima kasih!

xem
sumber
Terkait .
Peter Taylor
4
Pertanyaan ini membutuhkan berbagai klarifikasi. Apakah Anda mencari program, fungsi, atau salah satunya? Apakah format output penting? Apakah angka harus diindeks dari 1, atau bisakah mereka diindeks dari 0? Dan apa kondisi kemenangan yang objektif?
Peter Taylor
3
@ xem ini hampir milik Math SE saat itu. Di mana mereka mungkin akan membuktikan kepada Anda bahwa angka-angka itu tidak menguntungkan Anda (meskipun ada beberapa nomor jackpot yang layak dibeli)
Cruncher
2
Apa angka yang bagus ?
DavidC
2
Saya cukup yakin bahwa itu terbukti bahwa Anda akan kehilangan banyak uang jika Anda benar-benar pergi membeli tiket keluaran oleh program seperti itu.
Michael Hampton

Jawaban:

1

Saya tahu ini tidak optimal , tapi ini kode di node.js:

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);
        }
    }
}

Beberapa contoh hasil:

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

lain:

> 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 ]

lain:

> 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 ]
greuze
sumber
1
Anda min_lottery_tickets(10, 5, 2)menghasilkan lebih banyak solusi daripada OP.
Groo
Saya tahu @Go, saya bilang saya tahu itu tidak optimal, tetapi ini adalah versi pertama yang saya miliki;) Ada saran tentang cara menghapus hasil "berlebihan"?
pudar
Hai Groo, Hai greuze, terima kasih banyak atas upaya pertama ini. Anda mendapat skor 21 (karena Anda menghasilkan 21 tiket untuk (10,5,2)). Saya tidak tahu bagaimana cara menghapus hasil yang berlebihan, karena itulah saya membuat topik ini. Saya masih bertanya-tanya seperti apa algoritma terbaik untuk melakukan pekerjaan ini.
xem
Berikut adalah beberapa bacaan yang bagus tentang masalah ini: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem
1
Ini masalah NP-lengkap, jadi saya khawatir tidak ada solusi ajaib. Kita harus "memaksa" perhitungan semua tiket yang mungkin dan penghapusan mereka yang berlebihan dengan membandingkan masing-masing kelompok angka dengan semua tiket lainnya. Itu akan membutuhkan waktu yang eksponensial.
xem