藍橋杯 演算法提高 求最大值

2022-05-01 08:00:07 字數 1444 閱讀 6599

題意:

給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。

輸入格式

輸入的第一行為n,數對的個數

以下n行每行兩個整數 ai bi

輸出格式

輸出你選定的數對的ai+bi之和

樣例輸入

5-403 -625

-847 901

-624 -708

-293 413

886 709

樣例輸出

1715

資料規模和約定

1<=n<=100

-1000<=ai,bi<=1000

思路:

不直接計算選定的數的ai+bi的和,而是轉化為計算在ai的和一定的情況下盡量使選定的bi的和最大。於是變成為乙個和01揹包差不多的問題。首先過濾掉所有ai和bi均小於0的數對,令dp[i][j]表示前i個數對,選定的ai的和為j的情況下bi的和的最大值,將dp[i][j]初始化為-inf,再將所有已知合法情況初始化:dp[i][a[i]] = b[i],之後dp[i][j] = max(dp[i - 1][j], dp[i][j]),若j - a[i]存在,dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i]] + b[i])。為避免負數作為陣列下標,要加乙個偏移量。

實現:

1 #include 2 #include 3 #include 4

using

namespace

std;56

const

int inf = 0x3f3f3f3f;7

const

int t = 100000;8

int a[105], b[105], dp[105][200005

], n, p, q;

9int solve(int

n)1017}

18for (int i = 0; i < n; i++)

19 dp[i][a[i] + t] =b[i];

20for (int i = 1; i < n; i++)

2129}30

int ans = -inf;

31for (int j = 0; j <= t; j++)

3235

return

ans;36}

3738

intmain()

3950

int ans =solve(cnt);

51if (ans <= -inf)

52 cout << "0"

<53else

54 cout << ans <55return0;

56 }

藍橋杯 演算法提高 求最大值

演算法提高 求最大值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。輸入格式 輸入的第一行為n,數對的個數 以下n行每行兩個整數 ai bi 輸出格...

藍橋杯 演算法提高 求最大值

演算法提高 求最大值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。輸入格式 輸入的第一行為n,數對的個數 以下n行每行兩個整數 ai bi 輸出格...

演算法提高 求最大值

演算法提高 求最大值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。輸入格式 輸入的第一行為n,數對的個數 以下n行每行兩個整數 ai bi 輸出格...