Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

In tổ hợp N phần tử đổi dấu sao cho tổng chia hết cho M trong C++


Cho mảng N phần tử. Tìm tất cả tổ hợp gán dấu + hoặc - cho các phần tử sao cho tổng chia hết cho M.

Input: array = {4, 7, 3} ; M = 3 Output: 5+4+3 ; 5+4-3

Giải pháp: Dùng tập lũy thừa (power set) để duyệt tất cả 2^N cách gán dấu. Kiểm tra tổng chia hết M.

Thuật toán

B1: Duyệt tất cả tổ hợp dấu '+' và '-' bằng power set.
B2: Nếu tổng chia hết M, in tổ hợp kèm dấu.

Chương trình minh họa

#include <iostream>
using namespace std;
void printDivisibleSum(int a[], int n, int m){
    for (int i = 0; i < (1 << n); i++) {
        int sum = 0;
        int num = 1 << (n - 1);
        for (int j = 0; j < n; j++) {
            if (i & num)
                sum += a[j];
            else
                sum += (-1 * a[j]);
            num = num >> 1;
        }
        if (sum % m == 0) {
            num = 1 << (n - 1);
            for (int j = 0; j < n; j++) {
                if ((i & num))
                    cout << "+ " << a[j] << " ";
                else
                    cout << "- " << a[j] << " ";
                num = num >> 1;
            }
            cout << endl;
        }
    }
}
int main(){
    int arr[] = {4, 7, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    int m = 3;
    cout << "Tổ hợp tổng chia hết cho n :\n";
    printDivisibleSum(arr, n, m);
    return 0;
}

Kết quả

- 4 + 7 - 3
- 4 + 7 + 3
+ 4 - 7 - 3
+ 4 - 7 + 3