2019暑假四考Kas(dp)

2021-09-25 08:45:49 字數 3278 閱讀 1968

題目描述

kile和pogi在街上撿到了n

nn張鈔票。在確定無法找到失主之後,兩人決定將鈔票平分。他們想要得到相同數量的錢,所以他們將這些鈔票盡可能分成價值相等的兩份。但是當鈔票無法平分的時候會剩下一些。

由於他們不能將剩餘的鈔票留在街上,他們決定去附近的賭場並將所有剩下的鈔票都押上,希望最終得到兩倍的賭注。幸運的是他們真的讓賭注翻倍了,於是kile和pogi平分了贏的錢。

由於極度興奮,他們失去了計算能力,請你幫助他們計算出每人帶回家了多少錢。

輸入

第一行輸入包含乙個整數n

nn。表示鈔票的張數。

接下來n行每行包含乙個整數cici

ci。第i +1

i+1i+

1行的整數cici

ci表示第i

ii張鈔票的面額。保證n

nn張鈔票的總值不超過105

10^5

105。

輸出

輸出乙個整數。表示兩人分別帶回家的錢。

範圍

1 ≤n

≤500

,1≤n≤500,

1≤n≤50

0,樣例

樣例輸入142

316樣例輸出1

6樣例輸入253

25813

樣例輸出2

18

思路

其實題目的目的就是求乙個最小數,使剩下沒有組成這個數的c(i

)c(i)

c(i)

,組成兩個相等的數,且組成這兩個數的c(i

)c(i)

c(i)

不重複,既然和這兩個數的值有關,那我們就定

d p[

i][j

][k]

dp[i][j][k]

dp[i][

j][k

]表示c(i

)c(i)

c(i)

給某個人後,第乙個人得到j

jj,第二個人得到k

kk時剩下的最小值

則d p[

i][j

][k]

=min

dp[i-1][j][k] (誰也不給)\\ dp[i-1][j-c(i)][k]-c(i)(給第乙個人)\\ dp[i-1][j][k-c(i)]-c(i)(給第二個人) \end

dp[i][

j][k

]=mi

n⎩⎪⎨

⎪⎧​d

p[i−

1][j

][k]

(誰也不

給)dp

[i−1

][j−

c(i)

][k]

−c(i

)(給第

乙個人)

dp[i

−1][

j][k

−c(i

)]−c

(i)(

給第二個

人)​那麼最後答案肯定就是dp[

n][a

][a]

dp[n][a][a]

dp[n][

a][a

]且aa

a最大這樣肯定**

那麼有什麼可以將j,k

j,kj,

k兩維消成一維呢,儲存他們的差值

所以d p[

i][j

]dp[i][j]

dp[i][

j]表示c (i

)c(i)

c(i)

給某個人後,兩人的差值為j

jj時剩下最小的

則 dp

[i][

j]=m

in

dp[i-1][j]\\ dp[i-1][abs(j-c[i])]-c[i]\\ dp[i-1][c[i]+j]-c[i] \end

則dp[i]

[j]=

min⎩

⎪⎨⎪⎧

​dp[

i−1]

[j]d

p[i−

1][a

bs(j

−c[i

])]−

c[i]

dp[i

−1][

c[i]

+j]−

c[i]

​ 是不是感覺挺麻煩,那我們就倒著來

所以d p[

i][j

]dp[i][j]

dp[i][

j]表示c (i

)c(i)

c(i)

給某個人後,兩人的差值為j

jj時兩人和的最大值

則d p[

i][j

]=mi

ndp[i-1][j] \\ dp[i-1][abs(j-c[i])]+c[i] \\ dp[i-1][c[i]+j]+c[i] \end

dp[i][

j]=m

in⎩⎪

⎨⎪⎧​

dp[i

−1][

j]dp

[i−1

][ab

s(j−

c[i]

)]+c

[i]d

p[i−

1][c

[i]+

j]+c

[i]​

所以此題就沒什麼難度了

code

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

int n, sum, ans =

0x3f3f3f3f

;int a[

505]

;int dp[

505]

[100005];

inline

intabs

(int x)

intmain()

sort

(a+1

, a+

1+n)

;for

(int i =

1; i <= n; i ++)}

printf

("%d\n"

, sum-dp[n][0

]/2)

;return0;

}

2019暑假五考Ronald(神仙結論題)

題目描述 乙個國家有n個城市,城市之間連線著雙向航空線路。一位瘋狂的航空公司總裁ronald krump經常改變航班時刻表。更準確地說,他每天都做以下事情 選擇其中乙個城市 如果該城市和某個其他城市之間之前沒有航線那麼在這兩個城市之間建立一條航線,如果該城市和某個其他城市之間之前已有航線那麼取消這條...

2019暑假集訓

7.8 題解a.類似於保護古蹟的亂搞 b.可持久化線段樹維護塊與塊的連邊 暴力匹配 c.burnside引理好題 補不來.jpg ctsc2014 隨機數 這裡 感覺是一道比較好的題 常見套路又忘了系列 n個點無向連通圖計數 考慮1號點所在聯通塊大小 減掉 然後得到乙個柿子可以分治fft 7.9題解...

2019暑假集訓第四周tips

string型別擷取字串 str.substr 引數1,引數2 引數1 開始下標 引數2 擷取長度 浮點數的比較不一定準確,特別是在判斷相等的時候,在條件判斷語句中要把相比較的數都盡量化成整數。或者相減使其兩者的差小於足夠的精度,可以看做兩數相同 二分查詢 迴圈的判定條件是 left right 為...