ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 1"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 10 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน) | |||
แถว 1: | แถว 1: | ||
− | อินพุต: เซตของจำนวนเต็ม <math>A=\{ a_1, a_2,... ,a_n \} , | + | อินพุต: เซตของจำนวนเต็ม <math>A=\{ a_1, a_2,... ,a_n \} \, </math> ที่มีสมาชิก <math> n \, </math> ตัว และจำนวนเต็ม <math> S \, </math> |
+ | |||
+ | เอาพุต: คำตอบว่า "ใช่" หรือ "ไม่ใช่" | ||
+ | |||
+ | แนวคิด: เนื่องจากข้อนี้ต้องการตรวจสอบซับเซตทุก ๆ ซับเซตของ เซต <math>A \,</math> ฉะนั้นวัตถุที่เราสนใจก็คือ ซับเซตนั่นเอง ซึ่งในห้องเรียนได้เรียนถึงวิธีการหยิบซับเซตขึ้นมาพิจารณาทีละซับเซตกันไปแล้ว เราก็จะใช้วิธีนั้นกัน นอกจากนี้โจทย์ข้อนี้ต้องการตรวจสอบว่าซับเซตที่เรากำลังพิจารณาอยู่นั้นมีค่าผลบวกเท่ากับจำนวนเต็ม <math>S \,</math> หรือไม่ แสดงว่าเงื่อนไขก็คือ ผลบวกของซับเซตที่กำลังพิจารณาเท่ากับจำนวนเต็ม <math>S \,</math> หรือไม่นั่นเอง | ||
+ | |||
+ | ให้อะเรย์ A เก็บค่าจำนวนเต็ม <math> n /, </math> ตัว อะเรย์ G แต่ละช่องเก็บค่า 1 หรือ 2 ถ้า G[i] เก็บค่า 1 หมายถึง สมาชิกตัวที่ i ในอะเรย์ A เป็นสมาชิกของซับเซต แต่ถ้าเก็บค่า 2 คือไม่เป็นสมาชิกของซับเซต | ||
+ | |||
+ | จากแนวคิดข้างต้นสามารถเขียนเป็น pseudocode ได้ดังนี้ | ||
+ | <geshi lang="c"> | ||
+ | SUM(A,G,n) | ||
+ | { | ||
+ | sum <-- 0 | ||
+ | for i=0 to n-1 | ||
+ | { | ||
+ | if G[i] = 1 | ||
+ | { | ||
+ | sum = sum + A[i] | ||
+ | } | ||
+ | } | ||
+ | return(sum) | ||
+ | } | ||
+ | </geshi> | ||
+ | |||
+ | <geshi lang="c"> | ||
+ | GENERATE(k) | ||
+ | { | ||
+ | if k=0 | ||
+ | { | ||
+ | v<--SUM(A,G,n) | ||
+ | if (v=S) | ||
+ | { | ||
+ | return 1 | ||
+ | }else{ | ||
+ | return 0 | ||
+ | } | ||
+ | }else{ | ||
+ | for G[k-1]= 1 to G[k-1]=2 | ||
+ | { | ||
+ | GENERATE(k-1) | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </geshi> | ||
+ | |||
+ | เนื่องจากจำนวนซับเซตที่พิจารณาทั้งหมดมี <math>2^n \,</math> ซับเซต และแต่ละซับเซตต้องทำการตรวจสอบว่าผลบวกของมันเท่ากับ <math>S \, </math> หรือไม่ ซึ่งใช้เวลาอย่างมาก <math>O(n) \, </math> ดังนั้น เวลาการทำงานทั้งหมดของอัลกอริทึมคือ <math>O(n2^n) \,</math> นั่นเอง |
รุ่นแก้ไขปัจจุบันเมื่อ 09:18, 4 กันยายน 2552
อินพุต: เซตของจำนวนเต็ม ที่มีสมาชิก ตัว และจำนวนเต็ม
เอาพุต: คำตอบว่า "ใช่" หรือ "ไม่ใช่"
แนวคิด: เนื่องจากข้อนี้ต้องการตรวจสอบซับเซตทุก ๆ ซับเซตของ เซต ฉะนั้นวัตถุที่เราสนใจก็คือ ซับเซตนั่นเอง ซึ่งในห้องเรียนได้เรียนถึงวิธีการหยิบซับเซตขึ้นมาพิจารณาทีละซับเซตกันไปแล้ว เราก็จะใช้วิธีนั้นกัน นอกจากนี้โจทย์ข้อนี้ต้องการตรวจสอบว่าซับเซตที่เรากำลังพิจารณาอยู่นั้นมีค่าผลบวกเท่ากับจำนวนเต็ม หรือไม่ แสดงว่าเงื่อนไขก็คือ ผลบวกของซับเซตที่กำลังพิจารณาเท่ากับจำนวนเต็ม หรือไม่นั่นเอง
ให้อะเรย์ A เก็บค่าจำนวนเต็ม ตัว อะเรย์ G แต่ละช่องเก็บค่า 1 หรือ 2 ถ้า G[i] เก็บค่า 1 หมายถึง สมาชิกตัวที่ i ในอะเรย์ A เป็นสมาชิกของซับเซต แต่ถ้าเก็บค่า 2 คือไม่เป็นสมาชิกของซับเซต
จากแนวคิดข้างต้นสามารถเขียนเป็น pseudocode ได้ดังนี้ <geshi lang="c"> SUM(A,G,n) {
sum <-- 0 for i=0 to n-1 { if G[i] = 1 { sum = sum + A[i] } } return(sum)
} </geshi>
<geshi lang="c"> GENERATE(k) {
if k=0 { v<--SUM(A,G,n) if (v=S) { return 1 }else{ return 0 } }else{ for G[k-1]= 1 to G[k-1]=2 { GENERATE(k-1) } }
} </geshi>
เนื่องจากจำนวนซับเซตที่พิจารณาทั้งหมดมี ซับเซต และแต่ละซับเซตต้องทำการตรวจสอบว่าผลบวกของมันเท่ากับ หรือไม่ ซึ่งใช้เวลาอย่างมาก ดังนั้น เวลาการทำงานทั้งหมดของอัลกอริทึมคือ นั่นเอง