สร้างตั๋วลอตเตอรีที่น้อยที่สุดเพื่อเล่นเพื่อให้มีหมายเลขที่ดีอย่างน้อย N ตัว


11

นี่เป็นวิชาคณิตศาสตร์ที่ค่อนข้างซับซ้อน แต่น่าสนใจมาก (รู้จักกันในชื่อ"การแก้ปัญหา" )

และฉันต้องการให้คุณช่วยนำไปใช้

ลองนึกภาพเกมลอตเตอรีที่แต่ละตั๋วต้องเลือก 5 ตัวเลขสุ่มในชุดของ 50 หมายเลข (จาก 1 ถึง 50)

มันค่อนข้างง่ายที่จะทราบความน่าจะเป็นของตั๋วที่ชนะหรือความน่าจะเป็นที่จะมีตัวเลขที่ดี 1, 2, 3 หรือ 4

นอกจากนี้ยังค่อนข้างง่ายในการ "สร้าง" ตั๋วทั้งหมดที่มีหมายเลขที่ดี 1, 2, 3, 4

คำถามของฉัน (และการท้าทายรหัส) เกี่ยวข้องกับสิ่งนี้ แต่แตกต่างกันเล็กน้อย:

ฉันต้องการซื้อตั๋วลอตเตอรี (น้อยที่สุดเท่าที่จะเป็นไปได้) เช่นอย่างน้อยหนึ่งตั๋วของฉันมี 3 หมายเลขที่ดี

ท้าทาย

เป้าหมายของคุณคือการใช้โซลูชันทั่วไป (เป็นโปรแกรมหรือเพียงฟังก์ชั่น) เช่นนี้ในภาษาใด ๆ :

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

สำหรับตัวอย่างข้างต้นหนึ่งจะต้องโทร:

min_lottery_tickets(50, 5, 3)

และโปรแกรมจะสร้างชุดตั๋วที่เล็กที่สุดเพื่อเล่นเพื่อให้บรรลุเป้าหมายนี้


ตัวอย่าง:

 min_lottery_tickets(10, 5, 2)

จะส่งออก 7 ตั๋วเช่นนั้น:

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

เพราะตั๋วดังกล่าวเพียงพอที่จะครอบคลุมหมายเลขใดก็ได้ตั้งแต่ 1 ถึง 10


เอาท์พุต

ข้อความหนึ่งบรรทัดต่อตั๋วตารางหรือช่องว่างระหว่างตัวเลข


ใครชนะ

โปรแกรมที่มีประสิทธิภาพสูงสุดชนะ (เช่นโปรแกรมที่สร้างตั๋วน้อยที่สุดสำหรับพารามิเตอร์ข้างต้น):

min_lottery_tickets(50, 5, 3)


ขอบคุณ!


ที่เกี่ยวข้อง
Peter Taylor

4
คำถามนี้ต้องการคำอธิบายที่หลากหลาย คุณอยู่หลังโปรแกรมฟังก์ชั่นหรือไม่? รูปแบบผลลัพธ์มีความสำคัญหรือไม่ ตัวเลขต้องได้รับการจัดทำดัชนีจาก 1 หรือสามารถเป็นดัชนีจาก 0 ได้หรือไม่ และเงื่อนไขการชนะวัตถุประสงค์คืออะไร?
Peter Taylor

3
@ xem สิ่งนี้เกือบเป็นของ Math SE แล้ว ที่พวกเขาอาจจะพิสูจน์ให้คุณเห็นว่าตัวเลขไม่ได้อยู่ในความโปรดปรานของคุณ (แม้ว่าจะมีอยู่จำนวนแจ็คพอต st มันคุ้มค่าที่จะซื้อตั๋ว)
Cruncher

2
คืออะไรที่ดีจำนวน?
DavidC

2
ฉันค่อนข้างมั่นใจว่ามันพิสูจน์ได้ว่าคุณจะสูญเสียเงินเป็นจำนวนมากหากคุณไปซื้อตั๋วที่ออกโดยโปรแกรมดังกล่าว
Michael Hampton

คำตอบ:


1

ฉันรู้ว่ามันไม่เหมาะสมแต่นี่คือรหัสใน 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);
        }
    }
}

ตัวอย่างผลลัพธ์บางส่วน:

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

อื่น ๆ :

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

อื่น ๆ :

> 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
คุณmin_lottery_tickets(10, 5, 2)สร้างการแก้ปัญหามากขึ้นกว่าของ OP
Groo

ฉันรู้ @Groo ฉันบอกว่าฉันรู้ว่ามันไม่เหมาะสม แต่นี่เป็นเวอร์ชันการทำงานแรกที่ฉันมี;) มีข้อเสนอแนะใด ๆ เกี่ยวกับวิธีลบผลลัพธ์ "ซ้ำซ้อน" หรือไม่
greuze

สวัสดี Groo สวัสดี greuze ขอบคุณมากสำหรับความพยายามครั้งแรกนี้ คุณมีคะแนน 21 (เพราะคุณสร้างตั๋ว 21 ใบสำหรับ (10,5,2)) ฉันไม่ทราบวิธีการลบผลลัพธ์ที่ซ้ำซ้อน แต่นั่นเป็นเหตุผลที่ฉันสร้างหัวข้อนี้ ฉันยังคงสงสัยว่าอัลกอริทึมที่ดีที่สุดในการทำงานนี้เป็นอย่างไร
xem

นี่คือการอ่านที่ดีเกี่ยวกับเรื่อง: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem

1
มันเป็นปัญหาที่สมบูรณ์แบบของ NP ดังนั้นฉันจึงกลัวว่าจะไม่มีวิธีแก้ปัญหาเวทย์มนตร์ เราต้อง "บังคับเดรัจฉาน" การคำนวณตั๋วที่เป็นไปได้ทั้งหมดและการกำจัดตั๋วที่ซ้ำซ้อนโดยการเปรียบเทียบแต่ละกลุ่มของตัวเลขกับตั๋วอื่น ๆ ทั้งหมด นั่นจะใช้เวลาชี้แจง
xem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.