試題 演算法提高 求最大值

2021-10-18 13:03:22 字數 2490 閱讀 2406

時間限制:1.0s 記憶體限制:256.0mb

問題描述

給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之和非負。我們可以看成乙個揹包題,把ai當作容量 bi當作價值,我們知道揹包題題目已經給出了可以裝的總量,但物品沒有負數容量的物品。我們就建立dp[i] i表示當前容量的價值。

我們先解決可以裝的總量因為題中的資料規模n最大可以取100,每次容量大小範圍是-1000<=ai,bi<=1000 那麼我們先取乙個中界點 那意思就是物品容量最大為1001000 最小就是100-1000,那麼總量就是200000。那我們說的中界點就是100000了。我們揹包取的是價值的最大值,如果我們把dp值全部賦值為0的話那麼價值為負數就會出現取0的結果,所有我們就取乙個比總數的最小值我取的是-1000000000。因為dp[t]為中界點也就是0容量 所以我們就把他初始化dp[t]=0;

然後我們就需要考慮當物品的容量為負數和正數的情況。

當為正數時我們是從大的容量一直倒推到小的容量因為需要之前的值所以我們取值範圍就是(ma,a-1),if dp[j-a]>inf: 當他是inf時就沒有必要做下面的運算了。我們的轉移方程就得 dp[j]=max(dp[j],dp[j-a]+b)

當為負數時j-a 因為a為負數所以j-a是大於j 說明需要取的是j大於的位置的數,所以我們就可以在倒推了,那取值範圍就是(0,ma+a+1) ,因為dp[i]只可以取到20000以內的值所以需要ma+a (a數負數),那他的轉移式還是dp[j]=max(dp[j],dp[j-a]+b)

當我們處理完後需要求的是ai+bi之和 我們現在知道對應的ai 和bi 的和了但需要滿足ai之和非負,bi之和非負。

我們知道中界點就是100000那就是容量為0的時候 。意思就是表示ai的和大於等於0 就是大於等於dp[100000]。 那麼我們的取值範圍就是100000到200000.我們bi和想大於等於0的話就是dp[i]的值大於0就可以了。如果滿足條件dp[i]+i-100000 dp[i]為bi i-100000為ai 因為中界點是100000 .

程式:

n=

int(

input()

)defge(

):ma=

200000

t=100000

#中界值

inf=

-1000000000

#條件值

dp=[inf for i1 in

range

(ma+

1500)]

#dp[i] i表示當前容量的價值

dp[t]=0

for i in

range

(n):

a,b=

map(

int,

input()

.split())

#ai 和 bi值

if a<

0and b<0:

#同時為負數就可以進入揹包的必要了

continue

if a>=0:

#當容量為正數時

for j in

range

(ma,a-1,

-1):

if dp[j-a]

>inf:

#當為初始值就沒有執行下面的必要

dp[j]

=max

(dp[j]

,dp[j-a]

+b)else

:#當容量為負數時

for j in

range(0

,ma+a+1)

:if dp[j-a]

>inf:

dp[j]

=max

(dp[j]

,dp[j-a]

+b)return dp

dp1=ge(

)con=

0for i in

range

(100000

,200001):

if dp1[i]

>=0:

con=

max(con,dp1[i]

+i-100000

)#求ai 加 bi 的最大值

print

(con)

演算法提高 求最大值

演算法提高 求最大值 時間限制 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 輸出格...