কম্পিউটার টিউটোরিয়াল

C++-এ সাবসেট পার্থক্যের যোগফল


এই সমস্যাতে, আমাদের n সংখ্যক এলিমেন্টের একটি সেট S দেওয়া আছে। আমাদের কাজ হলো সাবসেট পার্থক্যের যোগফল বের করার প্রোগ্রাম লিখা, যেটি সাবসেটের শেষ এবং প্রথম এলিমেন্টের পার্থক্য।

ফর্মুলা হচ্ছে,

sumSubsetDifference = Σ [last(s) - first(s)] s হলো সেট S-এর সাবসেট।

উদাহরণ দিয়ে বুঝি,

ইনপুট −

S = {1, 2, 9} n = 3

আউটপুট −

ব্যাখ্যা − সব সাবসেট হচ্ছে −

{1}, last(s) - first(s) = 0 
{2}, last(s) - first(s) = 0 
{9}, last(s) - first(s) = 0 
{1, 2}, last(s) - first(s) = 1 
{1, 9}, last(s) - first(s) = 8 
{2, 9}, last(s) - first(s) = 7 
{1, 2, 9}, last(s) - first(s) = 8 
Sum = 1 + 8 + 7 + 8 = 24

এই সমস্যার একটি সহজ সমাধান হচ্ছে সব সাবসেটের জন্য শেষ এবং প্রথম এলিমেন্টের পার্থক্য বের করে যোগ করা। এটি সবচেয়ে দক্ষ সমাধান নয়, তাই একটি আরও দক্ষ সমাধান আলোচনা করা যাক।

n এলিমেন্টের একটি সেট S-এর জন্য, যোগফল অ্যারে এলিমেন্ট দিয়ে শুরু হওয়া সাবসেটের সংখ্যা ব্যবহার করেও বের করা যায়।

তবে,

sumSetDifference(S) = Σ [last(s) - Σfirst(s)]

একটি সেট S যার এলিমেন্টগুলো {s1, s2, s3, … sn}।

s1 দিয়ে শুরু হওয়া সাবসেটগুলো {s2, s3, … sn} এলিমেন্টগুলোর কোম্বিনেশন দিয়ে তৈরি হবে। এতে 2n-1টি সেট বने।

এভাবে s2 দিয়ে শুরু হওয়া সাবসেট 2n-2টি।

সাধারণ করলে, Si দিয়ে শুরু হওয়া সাবসেট 2n-i।

তাহলে সব সাবসেটের প্রথম এলিমেন্টের যোগফল −

SumFirst = a1.2n-1 + a2.2n-2 + a3.2n-3 + … + an.2n-n

একইভাবে, শেষ এলিমেন্ট ফিক্স করে SumLast বের করা যাবে।

SumLast = a1.2n-n + a1.2n - (n-1) + a3.2n - (n-2) + ... + an.2n - (n-(n-1))

উদাহরণ

উপরোক্ত সমাধানের প্রোগ্রাম,

#include<iostream> 
#include<math.h> 
using namespace std; 

int CalcSumFirst(int S[], int n) { 
    int sum = 0; 
    for (int i = 0; i < n; i++) 
        sum = sum + (S[i] * pow(2, n-i-1)); 
    return sum; 
} 

int CalcSumLast(int S[], int n) { 
    int sum = 0; 
    for (int i = 0; i < n; i++) 
        sum = sum + (S[i] * pow(2, i)); 
    return sum; 
} 

int main() { 
    int S[] = {1, 4, 9, 6}; 
    int n = 4; 
    int sumSetDiff = CalcSumLast(S, n) - CalcSumFirst(S, n); 
    printf("The sum of subset differences is %d", sumSetDiff); 
    return 0; 
}

আউটপুট

The sum of subset differences is 45

  1. C++-এ দেওয়া যোগফলের সাথে সর্বোচ্চ আকারের সাবসেট

  2. C++ STL-এ অ্যারে যোগফল (Array Sum)

  3. C++ তে ন্যূনতম এবসোলিউট ডিফারেন্স যোগফল ওয়ালা অ্যারে উপাদান

  4. C++-এ অ্যালিকোট সম (Aliquot Sum)