開啟章節選單

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';
  }
}