ABA


"|חידה| כתוב תוכנית שמחשבת את מספר האפשרויות לקבל"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15181 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15181
menda 
חבר מתאריך 22.5.06
3563 הודעות
   17:04   06.02.09   
אל הפורום  
  |חידה| כתוב תוכנית שמחשבת את מספר האפשרויות לקבל  
 
   ערכתי לאחרונה בתאריך 06.02.09 בשעה 17:04 בברכה, menda
 
סכום מוגדר מתוך סדרת מספרים מוגדרת.
לדוגמה. בתחילת התוכנית יהיה נתון

int Sum=500;
int Numbers={2,4,27,55,125,135}

והפלט אמור להיות כל הצירופים האפשריים שסכום המספרים במערך יתן את הסכום 500...

הדוגמה הקודמת תתן פלט ארוך מאוד, אז הנה דוגמה קצרה עם פלט לדוגמה


int Sum=10;
int Numbers={1,4,10}

הפלט יהיה

number of combination= 4
1) 10*1=10
2) 1*4+6*1=10
3) 2*4+2*1=10
4) 1*10=10

תשדלו לכתוב את התוכנית בC, בשימוש פרוצדורות ומערכים..


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תכתוב שיעורי בית וזהו akoka 06.02.09 18:01 1
     חחחחnחחחחnחחחחnחחחחn Deuce  06.02.09 18:14 2
  דיי דומה לשאלה שנשאלה כאן לפני כמה שבועות ... Deuce  06.02.09 18:16 3
     אתה יכול לכתוב את הקוד? זה לא יעבוד. menda  06.02.09 22:34 4
         חח יאללה אני אשכרה מתעב אותך akoka 06.02.09 23:21 5
             חח מצטער. לא מכיר פה את האנשים... menda  06.02.09 23:30 6
             לא הבנתי מה הוא אמר לשלוח את כל הפרמוטציות כי המערך menda  06.02.09 23:31 7
  אני ארחיב קצת יותר, Deuce  07.02.09 00:33 8
     שלבי קושי: חישוב מספר צירופים. להדפיס אותם. לייעל תהליך menda  07.02.09 00:51 9
         אני אכתוב תכנית כי זה מתחיל להסתבך, Deuce  07.02.09 00:55 10
         יש סיבוכיות מוגבלת? Deuce  07.02.09 01:03 11
             כנראה מדובר בבעיית NP. אבל עדיין אפשר לייעל את התהליך menda  07.02.09 01:06 12
                 רמז: לחשוב על דרך לחשב בכמה גדל מספר הצירופים menda  07.02.09 01:09 13
                     לצערי אני מאוד עסוק והחידה לא כזאת פשוטה. Deuce  07.02.09 15:49 14
                         ובדיוק כאן הרקורסיה נכנסת לפעולה menda  07.02.09 16:36 15
  מצאתי קצת זמן בשעות הקטנות לפתור את זה, Deuce  08.02.09 03:46 16
     עבור קלט של 1 5 25 50, וסכום של 100, מה התוצאה? menda  09.02.09 02:27 17
         התכנית עדיין לא מספיק יעילה כדי לענות על זה (: Deuce  09.02.09 23:35 18
             קבל תוצאה מהתוכנית שכתבתי: menda  10.02.09 00:15 19
                 JAVA קצת איטית אבל אני בטוח שמצאת משהו יותר יעיל משלי. Deuce  10.02.09 01:08 20

       
akoka

   18:01   06.02.09   
אל הפורום  
  1. תכתוב שיעורי בית וזהו  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   18:14   06.02.09   
אל הפורום  
  2. חחחחnחחחחnחחחחnחחחחn  
בתגובה להודעה מספר 1
 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   18:16   06.02.09   
אל הפורום  
  3. דיי דומה לשאלה שנשאלה כאן לפני כמה שבועות ...  
בתגובה להודעה מספר 0
 
אתה שולח רקורסיבית את כל הפרמוטציות בכל שלב באופן הבא:

(+ (Foo(Number+a1,a2,...,an)) ... (Foo(a1,a2,...,an+Number)))

תנאי העצירה מניח שהוא דיי ברור ...






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   22:34   06.02.09   
אל הפורום  
  4. אתה יכול לכתוב את הקוד? זה לא יעבוד.  
בתגובה להודעה מספר 3
 
   .


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka

   23:21   06.02.09   
אל הפורום  
  5. חח יאללה אני אשכרה מתעב אותך  
בתגובה להודעה מספר 4
 
   סליחה על ההקצנה ,אבל במקום ליהיות ראש קטן ,ולחשוב שאנשים פה מפגרים ,ולהגיד לDeuce כאילו זה לא עובד ,כדי שהוא ייפרסם קוד ,זה טמטום תסלח לי ,אבל אם היה לך מעט שכל/היגיון היית מפרסם את מה שכתבת ע"פ הרעיון של אייל ,ותאמין לי שהוא היה עוזר לך ,אבל אתה פשוט בדיחה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   23:30   06.02.09   
אל הפורום  
  6. חח מצטער. לא מכיר פה את האנשים...  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   23:31   06.02.09   
אל הפורום  
  7. לא הבנתי מה הוא אמר לשלוח את כל הפרמוטציות כי המערך  
בתגובה להודעה מספר 5
 
   יכול להיות ארוך..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:33   07.02.09   
אל הפורום  
  8. אני ארחיב קצת יותר,  
בתגובה להודעה מספר 0
 
יש שתי גישות לבעייה:
א. הגישה שלי, אבל הגישה שלי טוענת שפתרונות כמו:

1+1+1+1+6=0
1+1+6+1+1=0

מהווים 2 פרמוטציות שונות ולכן הוא מגדיל את מספר האפשרויות.
אני אחשוב איך לנסח פתרון לגישה ב':
ב. מקדמים נקבעים ביחידות.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   00:51   07.02.09   
אל הפורום  
  9. שלבי קושי: חישוב מספר צירופים. להדפיס אותם. לייעל תהליך  
בתגובה להודעה מספר 8
 
   ערכתי לאחרונה בתאריך 07.02.09 בשעה 00:53 בברכה, menda
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:55   07.02.09   
אל הפורום  
  10. אני אכתוב תכנית כי זה מתחיל להסתבך,  
בתגובה להודעה מספר 9
 
מה שכן, אני יכול פשוט לשמור פרמוטציות של מקדמים ולדאוג שאם אני אתקל בהם שוב אז לא למנות אותן.
אני יכול להחסיר את הפרמטציות הזהות בסוף, גם לא בעייתי.

אני פשוט אוהב לכתוב הליך כזה רקורסיבית.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   01:03   07.02.09   
אל הפורום  
  11. יש סיבוכיות מוגבלת?  
בתגובה להודעה מספר 9
 
מה שעשיתי פשוט מונה לך את כל הצירופים ...
נניח כמו שאמרתי עבור:

6*1 + 1*4 = 1+1+1+1+1+1+4

יהיו לי בידיוק
7!/6! = 7
אפשרויות שיספרו.
ועבור

2*4+2*1= 4+4+1+1

יספרו לי
4!/2!^2
6 אפשרויות.

כלומר עבור הדוגמא שלך אני סופר 11 אפשרויות עודפות.
האלגוריתם שלי אכן הניב את המספר 15.

בלי הגבלות סיבוכיות אני יכול לבדוק פרמוטציות כפולות וכו'.
השאלה כמה יעיל אתה מצפה מזה להיות.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   01:06   07.02.09   
אל הפורום  
  12. כנראה מדובר בבעיית NP. אבל עדיין אפשר לייעל את התהליך  
בתגובה להודעה מספר 11
 
   ערכתי לאחרונה בתאריך 07.02.09 בשעה 01:06 בברכה, menda
 
שלב ראשון בייעול זה לא לספור את אותם צירופים...(מה גם שזה חלק מהדרישה)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   01:09   07.02.09   
אל הפורום  
  13. רמז: לחשוב על דרך לחשב בכמה גדל מספר הצירופים  
בתגובה להודעה מספר 12
 
   כשמוסיפים עוד מספר למערך...

לצורך הנוחות המערך מופיע בסדר עולה..(אפשר למיין בכל מקרה)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:49   07.02.09   
אל הפורום  
  14. לצערי אני מאוד עסוק והחידה לא כזאת פשוטה.  
בתגובה להודעה מספר 13
 
אבל בכל מקרה השאלה בעצם דנה בסכום איברי המערך עם מקדמים שלמים אי שליליים.
ברגע שאתה מוסיף איבר למערך, זה תלוי בגודלו כיצד הוא ישפיע על מספר האפשרויות.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   16:36   07.02.09   
אל הפורום  
  15. ובדיוק כאן הרקורסיה נכנסת לפעולה  
בתגובה להודעה מספר 14
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   03:46   08.02.09   
אל הפורום  
  16. מצאתי קצת זמן בשעות הקטנות לפתור את זה,  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 08.02.09 בשעה 03:46 בברכה, Deuce
 
אז ככה - הפתרון הראשון והפחות יעיל שלי מבוסס על מה שאמרתי למעלה, רק שאני מוסיף Set שאליו אני מכניס פרמוטציות. זוהי קבוצה ולכן לא נכניס פרמוטציות זהות של מקדמים.

זה לא יעיל במיוחד מהבחינה שעבור 1+1+2 למשל אני אבצע 3 איטרציות במקום 1.

הסיבוכיות לא מטורפת אך זה לא מספיק יעיל.

בכל מקרה קוד ב-JAVA:


public static void foo(int[] Numbers , int[] Coefficient , int result
, TreeSet<String> Set) {
int sum = 0;
String Str = "";

for (int i=0 ; i<Numbers.length; i++) {
sum += Coefficient[i]*Numbers[i];
Str = Str + Coefficient[i];
}

if (sum > result)
return;

if (sum == result) {
Set.add(Str);
return;
}

for (int i = 0; i < Numbers.length; i++) {
int[] CoefficientNew = Coefficient.clone();
CoefficientNew[i]++;
foo(Numbers , CoefficientNew , result , Set);
}
}


תכנית ראשית:

public static void main(String[] args) {

int[] Numbers = {1,4,10};
int[] Ar = new int[3];
TreeSet<String> Set = new TreeSet<String>();

foo(Numbers,Ar,10,Set);
System.out.println(Set.size());


הפלט הוא 4 כפי שמצופה.
אפשר לייעל את זה לפני כניסה לצעד רקורסייה לבדוק אם צירוף המקדמים כבר מופיע ב-SET. זה עדיין לא מספיק יעיל כדי לפתור את אותו הדבר עבור SUM = 500 אבל זאת התחלה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   02:27   09.02.09   
אל הפורום  
  17. עבור קלט של 1 5 25 50, וסכום של 100, מה התוצאה?  
בתגובה להודעה מספר 16
 
   .


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:35   09.02.09   
אל הפורום  
  18. התכנית עדיין לא מספיק יעילה כדי לענות על זה (:  
בתגובה להודעה מספר 17
 
אני אנסה למצוא משהו יותר יעיל.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   00:15   10.02.09   
אל הפורום  
  19. קבל תוצאה מהתוכנית שכתבתי:  
בתגובה להודעה מספר 18
 
   ערכתי לאחרונה בתאריך 10.02.09 בשעה 00:16 בברכה, menda
 

קלט
int Nums={1,2,3,4,5,6,7,8,9,10,11,20,30,40,50};
int sum = 7000;


פלט
מספר הקומבינציות:
N=1,825,441,852,956,964,159

לקח לו פחות מ10 מילישניות לחשב את זה..
N מטיפוס long long


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   01:08   10.02.09   
אל הפורום  
  20. JAVA קצת איטית אבל אני בטוח שמצאת משהו יותר יעיל משלי.  
בתגובה להודעה מספר 19
 
מה אגיד לך - אני צריך לחשוב על זה קצת (מצרך קצת יקר כעת), אבל אני כן אקדיש לזה מתישהו זמן ואנסה לבוא עם תשובה






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net