الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ايجاد التوفيق الرياضي لعنصر داخل مجموعة

بدأه MemoryLess في 3 فبراير 2014 · 4 رد · 615 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

أنا شبة يائسة في حل هذي المعضلة، أتمنى منكم المساعدة

 

معادلة التوفيق الرياضي:

n!/k!(n-k)!
if n= {1,2,3,4)
and
k=2
then
1,2
1,3
1,4
2,3
2,4
3,4

if k=3
1,2,3
1,2,4
2,3,4

يوجد على النت أكواد كثيرة لحل هذة المسألة الرياضية

لكن أنا لا أريد ايجاد كل هذه المجموعات

أريد فقط حساب التوافيق للعنصر الأول مع بقية العناصر

1,2
1,3
1,4

 

في برنامجي map اسمها AssociatedItem على النحو التالي:

(1, {3, 4})(2, {3, 4})(3, {1, 2, 4})(4, {1,2,3, 4})(5, {1})

وأريد لكل رقم ايجاد التوفيق الرياضي

لكل مجموعة على حدة

فمثلا

(1, {3, 4})if k=3ثم نوجد التوافيق لل 11,31,4

نلاحظ، العناصر المرتبطة بالرقم 1 أقل من k

إذن اجعل k تساوي عدد العناصر المرتبطة بواحد، k=2

 

ثم ايجاد التوافيق للعد 2 وهكذا

 

 

 

وهذا الكود:

int k = 0;   std::map <int, vector <int> > Kcom;    int i = 1;    for (const auto& p1 : AssociatedItem)    {        k=4;        if (k > AssociatedItem[p1.first].size())            k = AssociatedItem[p1.first].size();        int count = 1;        int c = 0;        int j = AssociatedItem[p1.first].size();            while  (c != j)        {            cout << AssociatedItem[p1.first].size();            cout << "\n";                                while (count <= k)            {                 Kcom.push_back(p1.second[c]);                ++c;                ++count;            }            ++i;            // if j > k do            //-----                        count = 1;                    }    }

البرنامج يعمل بشكل صحيح قي حالتين

إذا كنت عدد العناصر أصغر أو تساوي k

 

المشكلة لو كانت عدد العناصر أكبر من k

 

مثلا لو كانت k=3

وأردنا ايجاد التوافيق للعدد 4 من العناصر المرتبطة بها وهي

1,2,3,5

أي المطلوب ايجاد هذا الشكل:

1,2,3

1,2,5

 

في المرة الأولى:

Kcom[4]=1,2,3

لكن لم استطيع كتابة كود للخطوة الثانية

Kcom[5]=1,2,5

عوضا عنه البرنامج فقط يضع

Kcom[5]=5

وبما إن c= 5 رقم واحد ، وبما إني وصلت لاخر عنصر في المجموعة

وبالتالي

count <k

يدخل اللوب ويظهر خطأ

وحتى لو وضعت شرط

لو وصلت لنهاية المجموعة، اخرج من اللوب

أنا لا اريد تخزين الرقم 5 فقط وانما

1,2,5

 

 

 

الرجاء المساعدة، ولكم جزيل الشكر

تم تعديل هذه المشاركة بواسطة MemoryLess في 3 فبراير 2014 في 08:43

#2
اقتباس

يوجد على النت أكواد كثيرة لحل هذة المسألة الرياضية

-10

مستحيل أن تتعلمي كتابة كود بهذه الطريقة

 

ببساطة : حلقة for تمر على جميع العناصر وتضيف أي عنصر لا يساوي العنصر المختار !

مثلاً

 2 5 6 7 8 9 4

من أجل 7

Kcom[7]=4,9,8,6,5,2

من أجل 2

Kcom[2]=4,9,8,6,5,7

فما المطلوب ؟

#3
مصطفى 36a2 كتب:

-10

مستحيل أن تتعلمي كتابة كود بهذه الطريقة

 

ببساطة : حلقة for تمر على جميع العناصر وتضيف أي عنصر لا يساوي العنصر المختار !

مثلاً

 2 5 6 7 8 9 4

من أجل 7

Kcom[7]=4,9,8,6,5,2

من أجل 2

Kcom[2]=4,9,8,6,5,7

فما المطلوب ؟

 

المطلوب:

مثلاً

 2 5 6 7 8 9 4

 

وأريد، ايجاد  توافيق الرقم 4 فقط (أول رقم في المجموعة فقط ) مع بقية العناصر

 

لنفترض ان المستخدم وضع قيمة

k=2

 

أريد تخزين (توافيق 4 مع بقية العناصر) بهذا الشكل

 

4,9

4,8

4,7

4,6

4,5

4,2

 

 

 

لنفترض ان المستخدم وضع قيمة

k=3

 

أريد تخزين (توافيق 4 مع بقية العناصر) بهذا الشكل

4,9,8

4,9,7

4,9,6

4,9,5

4,9,2

4,8,7

4,8,6

4,8,5

4,8,2

4,7,6

4,7,5

4,7,2

4,6,5

4,6,2

4,5,2

 

 

لنفترض ان المستخدم وضع قيمة

k=4

 

أريد تخزين (توافيق 4 مع بقية العناصر) بهذا الشكل

 

4,9,8,7

4,9,8,6

4,9,8,5

4,9,8,2

4,9,7,6

4,9,7,5

4,9,7,2

4,9,6,5

4,9,6,2

4,9,5,2

4,8,7,6

4,8,7,5

4,8,7,2

4,8,6,5

4,8,6,2

4,7,6,5

4,7,6,2

4,7,5,2

4,6,5,2

#4

طالما أنك تستطيعين إيجاد جميع التوافيق يمكنك بعد ذلك فلترتها للحصول على التوافيق التي تحتوي رقماً معيناً فقط ,

لنفترض أن لديك n عنصر في المجموعة S

وتريدين إيجاد جميع التوافيق الحاوية على العنصر a

عندها ستتحول المسألة إلى إيجاد جميع التوافيق في المجموعة S-a

مثال

المجموعة

1 2 3 4 5

نريد التوافيق الحاوي على 4

نوجد جميع التوافيق من أجل

5 3 2 1

.......................................

طريقة إيجاد جميع التوافيق

(الحل المتواضع ) عمل k حلقة for

كما يلي

int A[7]={9,7,6,4,5,3,1};    //we want all combinations that contains 5    int a[6]={9,7,6,4,3,1};    // k =4    for(int i=0;i<6;i++)        for(int j=i+1;j<6;j++)            for(int k=j+1;k<6;k++)                for(int l=k+1;l<6;l++)                    cout << '{' << "5,"<< a << ',' << a[j] << ',' <<a[k] << ',' <<a[l] << '}' <<endl;

 

ولكن كلما اختلفت k سنحتاج إلى تغيير عدد حلقات for

ولذلك نلجأ إلى العودية

كود بسيط يبين طريقة تمثيل حلقات for متداخلة عن طريق العودية ,

void combination(int array[],int startFrom , int size ,int k , int depth){
    if(depth!=k)
        for(int i=startFrom;i<size;i++)
        {
            combination(array,i+1 , size ,k , depth+1);
        }
    }
}

 

أظن أنني ذكرت الأفكار الأساسية

#5

التوافق nCr: هو عدد المجموعات الجزئية الناتجة من إحتيار r عنصر من أصل n عنصر من فئة ما بحث دائما و ابدا n >= r >= 0.

unsigned nCr(unsigned n, unsigned r)
{
	if (r>n) throw "r can not be greater than n";

	if (r == n || r == 0) return 1;

	if (r == 1 || n == r - 1) return n;

	const unsigned limit = n - r + 1;
	for(unsigned i= n-1; i >= limit; --i) n *= i;
	for(unsigned i= r-1; i >= 2; --i) r *= i;

	return n/r;
}

أولا: كيف يمكن حساب التوافق بين 4 مع كل من 2 5 6 7 8 9 و الأعداد 5 6 7 8 9 أكبر من 4؟

ثانيا: ماذا تعنى بـ "تخزين (توافيق 4 مع بقية العناصر) بهذا الشكل 4,8,7,2" ؟

 

 

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

مواضيع مشابهة