เลือกจากชุดตุ้มน้ำหนักที่มีอยู่เพื่อสร้างผลรวมเป้าหมาย


9

เมื่อทำการยกน้ำหนักฉันต้องการสร้างน้ำหนักที่เฉพาะเจาะจงโดยติดแผ่นเหล็กหลายแผ่นเข้ากับแท่ง

ฉันมีแผ่นต่อไปนี้:

  • 6 แผ่นละ 1 กิโลกรัม
  • 6 จานละ 2.5 กก
  • 6 จานละ 5 กิโลกรัม
  • 6 จานละ 10 กิโลกรัม

แถบน้ำหนัก 10 กิโลกรัม

มันได้รับอนุญาตเท่านั้นที่จะแนบแผ่นเป็นคู่ - พวกเขาจะถูกแนบที่ปลายแต่ละด้านของบาร์และการจัดเรียงที่ปลายทั้งสองจะต้องสมมาตรอย่างสมบูรณ์ (เช่นการแนบแผ่น 5 กิโลกรัมสองที่ปลายด้านหนึ่งและแผ่น 10 กิโลกรัมที่ ห้ามมิให้ใช้ปลายอีกข้างเพื่อเหตุผลด้านความปลอดภัย)

จัดทำโปรแกรมหรือฟังก์ชั่นที่บอกฉันว่าฉันต้องใช้แผ่นจำนวนเท่าไหร่เพื่อที่จะได้น้ำหนักรวมที่กำหนด อินพุตเป็นจำนวนเต็มมากกว่า 11 ผลลัพธ์คือ list / array / string จำนวน 4 ตัว หากเป็นไปไม่ได้ที่จะรวมเพลตที่มีอยู่เพื่อรับน้ำหนักเป้าหมายให้ส่งออกอาร์เรย์ศูนย์ / ว่างเปล่าสตริงที่ไม่ถูกต้องโยนข้อยกเว้นหรือบางอย่าง

หากมีการแก้ปัญหาหลายอย่างรหัสจะต้องส่งออกเพียงครั้งเดียว (ไม่ได้ให้ผู้ใช้เลือก - เขายุ่งเกินไปกับสิ่งอื่น ๆ )

กรณีทดสอบ:

12 -> [2 0 0 0] - 2 plates of 1 kg plus the bar of 10 kg
13 -> [0 0 0 0] - a special-case output that means "impossible"
20 -> [0 0 2 0] - 2 plates of 5 kg + bar
20 -> [0 4 0 0] - a different acceptable solution for the above
21 -> [6 2 0 0] - 6 plates of 1 kg + 2 plates of 2.5 kg + bar
28 -> [0 0 0 0] - impossible
45 -> [0 2 6 0] - a solution for a random number in range
112 -> [2 4 6 6] - a solution for a random number in range
121 -> [6 6 6 6] - maximal weight for which a solution is possible

หากรหัสของคุณส่งออกตัวเลขในลำดับที่ตรงกันข้าม (จากแผ่นหนาไปจนถึงสีอ่อน) โปรดระบุสิ่งนี้อย่างชัดเจนเพื่อหลีกเลี่ยงความสับสน


1
นี่ไม่ใช่คำถามที่นับจำนวนเหรียญขั้นต่ำใช่หรือไม่ ฉันไม่คิดว่าอัลกอริทึมโลภแบบเดียวกันจะล้มเหลวยกเว้นมีการ จำกัด จานที่ 6 ชนิดหนึ่ง ฉันคิดว่าอาจไม่แตกต่างกันพอสมควร แต่ฉันไม่แน่ใจ
FryAmTheEggman

1
อัลกอริทึมโลภใช้งานไม่ได้ (โดยไม่มีการดัดแปลงอย่างน้อย) เพราะตัวเลขมี จำกัด
Anatolyg

ที่เกี่ยวข้องแต่นั่นคือ ASCII
AdmBorkBork

ใช่เหตุผลที่ฉันโพสต์คือฉันไม่แน่ใจว่าการปรับเปลี่ยนนั้นมีความสำคัญเพียงพอ ฉันโพสต์เพื่อพยายามรับความคิดเห็นจากชุมชนและฉันจะลบความคิดเห็นของฉันหากดูเหมือนว่าชุมชนไม่เห็นด้วยกับฉัน
FryAmTheEggman

เราสามารถส่งออกโซลูชั่นทั้งหมดแทนที่จะเป็นเพียงหนึ่งเดียวได้หรือไม่?
Luis Mendo

คำตอบ:


5

เยลลี่ , 22 ไบต์

4ṗạµ×2,5,10,20S€+⁵iƓịḤ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

4ṗạµ×2,5,10,20S€+⁵iƓịḤ  Main link. No arguments

4                       Set the left argument and initial return value to 4.
 ṗ                      Take the Cartesian power of [1, 2, 3, 4] and 4, i.e.,
                        generate all 4-tuples of integers between 1 and 4.
  ạ                     Take the absolute difference of all integers in the
                        4-tuples and the integer 4. This maps [1, 2, 3, 4] to
                        [3, 2, 1, 0] and places [0, 0, 0, 0] at index 0.
   µ                    Begin a new, monadic chain. Argument: A (list of 4-tuples)
     2,5,10,20          Yield [2, 5, 10, 20].
    ×                   Perform vectorized multiplication with each 4-tuple in A.
              S€        Sum each resulting 4-tuple.
                +⁵      Add 10 to each sum.
                   Ɠ    Read an integer from STDIN.
                  i     Find its first index in the array of sums (0 if not found).
                     Ḥ  Unhalve; yield the list A, with all integers doubled.
                    ị   Retrieve the 4-tuple at the proper index.

6

MATL , 29 28 ไบต์

4t:qEZ^!"[l2.5AX]@Y*10+G=?@.

สำหรับอินพุตที่ไม่มีโซลูชันจะสร้างเอาต์พุตว่าง (โดยไม่มีข้อผิดพลาด)

ลองออนไลน์!

คำอธิบาย

4           % Push 4
t:q         % Duplicate 4 and transform into range [0 1 2 3]
E           % Multiply by 2: transform into [0 2 4 6]
Z^          % Cartesian power. Each row is a "combination" of the four numbers
!           % Transpose
"           % For each column
  [l2.5AX]  %   Push [1 2.5 5 10]
  @         %   Push current column
  Y*        %   Matrix multiply. Gives sum of products
  10+       %   Add 10
  G=        %   Compare with input: are they equal?
  ?         %   If so
    @       %     Push current column, to be displayed
    .       %     Break loop
            %   Implicit end
            % Implicit end
            % Implicit display

5

Mathematica, 70 ไบต์

Select[FrobeniusSolve[{2,5,10,20},2#-20],AllTrue[EvenQ@#&&#<7&]][[1]]&

ฟังก์ชั่นไม่ระบุชื่อ ใช้ตัวเลขเป็นอินพุตและเอาต์พุตรายการหรือข้อผิดพลาดและส่งคืน{}[[1]]หากไม่มีวิธีแก้ไข


4

เยลลี่ 25 ไบต์

×2,5,10,20S+⁵⁼³
4ṗ4’ÇÐfḢḤ

ลองที่นี่


2,5,10,20->2,5,⁵,20
Leun Nun

จริง ๆ ... ไม่ได้,เป็นพ่อพันธุ์? ทั้งชีวิตของฉันเป็นเรื่องโกหก
Leun Nun

@LeakyNun ,เป็นสิ่งมีชีวิต แต่ก็สามารถใช้เป็นตัวอักษรได้ 2,5,⁵,20ไม่ได้เป็น แต่ตัวอักษร ( 2,5และ20มี แต่,, และ,อะตอม) ดังนั้นคุณจะต้องมีอะไรบางอย่างที่จะรวมการเชื่อมโยง
Dennis

3

Python 3, 112 ไบต์

lambda n:[i for i in[[i//4**j%4*2for j in range(4)]for i in range(256)]if i[0]+2.5*i[1]+5*i[2]+10*i[3]+10==n][0]

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

มันทำงานอย่างไร

lambda n                                   Anonymous function with input target mass n
...for i in range(256)                     Loop for all possible arrangement indices i
[i//4**j%4*2for j in range(4)]             Create a base-4 representation of the index i,
                                           and multiply each digit by 2 to map from
                                           (0,1,2,3) to (0,2,4,6)
[...]                                      Package all possible arrangements in a list
...for i in...                             Loop for all possible arrangements i
i...if i[0]+2.5*i[1]+5*i[2]+10*i[3]+10==n  Return i if it gives the target mass
[...]                                      Package all solutions in a list
:...[0]                                    Return the first list element. This removes any
                                           multiple solutions, and throws an error if there
                                           being no solutions results in an empty list

ลองใช้กับ Ideone



1

Pyth, 34 31 25 ไบต์

h + fqQ +; s * VT [1 2.5 5;) yMM ^ U4 4] * 4] 0 
yMh + fqQ +; s * VT [2 5; y;) ^ U4 4] * 4] 0
yMhfqQ +; s * VT [2 5; y;) ^ U4 4

ชุดทดสอบ

ข้อผิดพลาดในความเป็นไปไม่ได้

นี่คือแรงเดรัจฉาน

ค่อนข้างเร็วเนื่องจากมีการจัดเตรียมเพียง 256 รายการเท่านั้น


1

สกาลา, 202 ไบต์

ตัดสินใจสกาล่าไม่ได้รับความรักมากที่นี่ดังนั้นฉันจึงนำเสนอวิธีการแก้ปัญหา (อาจไม่เหมาะสม) ในสกาล่า

def w(i:Int){var w=Map(20->0,10->0,5->0,2->0);var x=i-10;while(x>0){
var d=false;for(a<-w.keys)if(a<=x & w(a)<6 & !d){x=x-a;w=w.updated(a,w(a)+2);d=true;}
if(!d){println(0);return;}}
println(w.values);}

โปรแกรมแสดงผลลัพธ์ในลำดับย้อนกลับและมีขยะพิเศษเมื่อเปรียบเทียบกับโซลูชันในโพสต์ เมื่อไม่พบวิธีแก้ไขให้พิมพ์ 0

หมายเหตุ: ฉันไม่สามารถลบบรรทัดใหม่หรือช่องว่างใด ๆ เนื่องจาก Scala เป็นใบ้ดังนั้นฉันคิดว่าการลดขนาดวิธีการจะต้องทำซ้ำอีกครั้งเว้นแต่ฉันจะพลาดอะไรบางอย่างที่ชัดเจน


1

APL, 40 ไบต์

{2×(4⍴4)⊤⍵⍳⍨10+2×,⊃∘.+/↓1 2.5 5 10∘.×⍳4}

ใน⎕IO← 0 เป็นภาษาอังกฤษ:

  1. 10+2×,∘.+⌿1 2.5 5 10∘.×⍳4: สร้างอาเรย์ของตุ้มน้ำหนักที่เป็นไปได้ทั้งหมดโดยคำนวณผลรวมด้านนอก 4D ของตุ้มน้ำหนักต่อประเภทน้ำหนัก
  2. ⍵⍳⍨: ค้นหาดัชนีของที่กำหนด หากไม่พบดัชนีคือ 1 + จำนวนรวมของอาร์เรย์ที่ขั้นตอนที่ 1
  3. (4⍴4)⊤: แสดงดัชนีในฐาน 4 นั่นคือคำนวณพิกัดของ weigth ที่กำหนดในพื้นที่ 4D;
  4. : นำผลลัพธ์ไปสู่พื้นที่ที่มีปัญหาโดยที่พิกัดควรถูกตีความเป็นจำนวนครึ่งหนึ่งของเพลต

ตัวอย่าง: {2 × (4⍴4) ⊤⍵⍳⍨10 + 2 ×, ⊃∘. + / ↓ 1 2.5 5 10∘. ×⍳4} 112 2 4 6 6

โบนัส : เนื่องจาก APL เป็นภาษาอาเรย์หลายน้ำหนักจึงสามารถทดสอบได้ในครั้งเดียว ในกรณีนี้ผลลัพธ์จะถูกย้าย:

      {2×(4⍴4)⊤⍵⍳⍨10+2×,⊃∘.+/↓1 2.5 5 10∘.×⍳4}12 13 20 21 28 45 112 121
2 0 0 6 0 0 2 6
0 0 0 2 0 2 4 6
0 0 2 0 0 2 6 6
0 0 0 0 0 2 6 6

1

JavaScript (ES6), 109 ไบต์

n=>`000${[...Array(256)].findIndex((_,i)=>i+(i&48)*9+(i&12)*79+(i&3)*639+320==n*32).toString(4)*2}`.slice(-4)

ส่งคืน00-2เมื่อเกิดข้อผิดพลาด โซลูชันทางเลือกที่ส่งคืนundefinedเมื่อเกิดข้อผิดพลาดเช่นกัน 109 ไบต์:

n=>[...Array(256)].map((_,i)=>`000${i.toString(4)*2}`.slice(-4)).find(s=>+s[0]+s[1]*2.5+s[2]*5+s[3]*10+10==n)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.