題意:
給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 4using
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 輸出格...