開啟章節選單

10690 Expression Again

題目連結

題目描述

你會得到一個代數表達式,形式為:

(x1 + x2 + x3 + ... + xn) * (y1 + y2 + ... + ym)

以及總共 (n + m) 個整數

你需要使用這些給定的整數來找出這個表達式的最大值與最小值
例如,若給你:

(x1 + x2) * (y1 + y2)

以及數字:1、2、3、4,那麼最大值為:

(1 + 4) * (2 + 3) = 25

最小值為:

(4 + 3) * (2 + 1) = 21

輸入說明

每筆輸入資料以兩個正整數 N 與 M 開始(N, M < 51)
接下來的一行包含 (N + M) 個整數,範圍介於 -50 到 50 之間
輸入以檔案結尾(EOF)作為結束。最多會有 110 組測資

輸出說明

對於每一組測資,請輸出一行:最大值 與 最小值(以空格分隔)

解題思路

程式碼

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main() {
    int x, y;
    while (cin >> x >> y) {
        vector<int> v(x+y);
        int sum = 0;
        for (auto &i : v) {
            cin >> i;
            sum += (i += 50);
        }

        if (x > y) swap(x, y);

        bitset<100*100+10> dp[x+1]; dp[0][0] = 1;
        for (int i = 0; i < x+y; i++) for (int j = x; j >= 1; j--) dp[j] |= (dp[j-1] << v[i]);

        int mx = -1e9, mn = 1e9;
        for (int i = 0; i <= sum; i++) if (dp[x][i]) {
            int k = (i-x*50) * (sum-i-y*50);
            mx = max(mx, k);
            mn = min(mn, k);
        }

        cout << mx << ' ' << mn << '\n';
    }
}