Bài 11: Kiểu mảng

nguyễn an phát

Bài 2: Phân tích số
Cho số tự nhiên n (n ≤ 400). Hãy cho biết có bao nhiêu cách phân tích số n thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là một cách.
Ví dụ: Với n=5, có 7 cách phân tích:
1. 5 = 1 + 1 + 1 + 1 + 1
2. 5 = 1 + 1 + 1 + 2
3. 5 = 1 + 1 + 3
4. 5 = 1 + 2 + 2
5. 5 = 1 + 4
6. 5 = 2 + 3
7. 5 = 5

yêu cầu không dùng đệ quy

Anh Phạm
28 tháng 7 2021 lúc 21:35

Bạn sài Quy hoạch động đi

c++:

#include <iostream>
#include <vector>

using namespace std;

const int N = (int) 1e5 + 5;
const int MOD = (int) 1e9;

int a[N];
int n;

int main() {
    cin >> n;
    if (n == 0) {
        cout << 0 << endl;
        return 0;
    }

    vector<int> p;
    for (int i = 1;;) {
        p.push_back(i * (3 * i - 1) / 2);
        if (p.back() >= n) break;
        i = -i;
        if (i > 0) i++;
    }

    a[0] = 1;
    for (int i = 1; i <= n; ++i) {
        int sign = 1, cnt = 0;
        for (int j : p) {
            if (j > i) break;
            a[i] += sign * a[i - j];
            if (a[i] < 0) a[i] += MOD;
            if (a[i] >= MOD) a[i] -= MOD;
            cnt += 1;
            if (cnt == 2) {
                cnt = 0;
                sign = -sign;
            }
        }
    }

    cout << a[n] << endl;
    return 0;
}

 

 

Bình luận (0)

Các câu hỏi tương tự
Tưởng Ruy Thành
Xem chi tiết
Khánh Linh
Xem chi tiết
Nguyễn Triệu Nhật Khánh
Xem chi tiết
Khánh Linh
Xem chi tiết
Nguyễn Minh Linh
Xem chi tiết
Nguyễn Lê
Xem chi tiết
Anna Lagila
Xem chi tiết
Lee Jihoon
Xem chi tiết
nguyễn an phát
Xem chi tiết