P2340 奶牛會展(狀壓dp)

2022-04-06 22:21:41 字數 1303 閱讀 1028

奶牛想證明它們是聰明而風趣的。為此,貝西籌備了乙個奶牛博覽會,她已經對n 頭奶牛進行

了面試,確定了每頭奶牛的智商和情商。

貝西有權選擇讓哪些奶牛參加展覽。由於負的智商或情商會造成負面效果,所以貝西不希望出展奶牛的智商之和小於零,或情商之和小於零。滿足這兩個條件下,她希望出展奶牛的智商與情商之和越大越好,請幫助貝西求出這個最大值。

輸入格式:

• 第一行:單個整數n,1 ≤ n ≤ 400

• 第二行到第n + 1 行:第i + 1 行有兩個整數:si 和fi,表示第i 頭奶牛的智商和情商,−1000 ≤ si; fi ≤ 1000

輸出格式:

輸出格式

• 單個整數:表示情商與智商和的最大值。貝西可以不讓任何奶牛參加展覽,如果這樣做是最好的,輸出0

輸入樣例#1:

5

-5 7

8 -6

6 -3

2 1-8 -5

輸出樣例#1:

8

選擇第一頭,第三頭,第四頭奶牛,智商和為−5+6+2 = 3,情商和為7−3+1 = 5。再加

入第二號奶牛可使總和提公升到10,不過由於情商和變成負的了,所以是不允許的

特殊的0-1揹包。常見的想法就是設 f(i, j) 表示 i, j 能否到達,對這道題來說資料太大,會超時、超空間,因為其實根本就沒有這麼多狀態,很多狀態都是無效的。但是,陣列的下標和值都可以儲存資訊,所以我們可以把智商和情商分別存到到下標和值上,這樣就完美解決了空間的問題,也算是一種狀壓 dp。

最後要注意:c++ 中沒有負數下標,所以我們需要把 dp 陣列平移 m 位。

1 #include2 #include3 #include4

5using

namespace

std;

6const

int n = 405,m = 400000;7

int f[m*2+100]; //

f下標存iq,值存eq;

8int

iq[n],eq[n];

9int

n,ans;

1011

intmain()

1227

for (int i=1; i<=m; ++i)

28if(f[i+m] >= 0

)29 ans = max(ans,f[i+m]+i); //

i是智商,f[i+m]情商

30 printf("%d"

,ans);

31return0;

32 }

P2340 奶牛會展

f i 表示當 智商為i 時,情商 最高為多 少f i 表示當智商為i時,情商最高為多少 f i 表示 當智商為 i時,情 商最高為 多少具體類似講解請移步我的另一篇部落格 include define rep i,a,b for register int i a i b i define don ...

P2340 奶牛會展 DP 揹包

n 頭牛,每頭牛有智商 s i 情商 f i 問如何從中選擇幾頭牛使得智商情商之和最大 且 情商之和 智商之和非負 n le 400,10 3 le s i le 10 3 看似兩維難以處理,我們可以先考慮一維,做體積為智商 價值為情商的01揹包,最後遍歷體積不為負的狀態更新答案即可。需要注意的是,...

洛谷P2340 奶牛會展

題目背景 奶牛想證明它們是聰明而風趣的。為此,貝西籌備了乙個奶牛博覽會,她已經對n 頭奶牛進行 了面試,確定了每頭奶牛的智商和情商。題目描述 貝西有權選擇讓哪些奶牛參加展覽。由於負的智商或情商會造成負面效果,所以貝西不希望出展奶牛的智商之和小於零,或情商之和小於零。滿足這兩個條件下,她希望出展奶牛的...