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