洛谷P2340 奶牛會展

2021-08-06 01:13:25 字數 1474 閱讀 3851

題目背景

奶牛想證明它們是聰明而風趣的。為此,貝西籌備了乙個奶牛博覽會,她已經對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揹包問題。我們可以以情商為物品容量,智商為價值,將其轉為正規的01揹包問題。(樓下題解認為此方法未看到本質,但這種方法也能ac,但也可能是我造化太淺)

一點小優化(狀壓 dp):陣列的下標和值都可以儲存資訊,所以我們可以把智商存在下標上,情商存在值上。

最後要注意:c++ 中沒有負數下標,所以我們需要把 dp 陣列平移 m(揹包容量、為正數情商之和) 位。

#include

#include

#include

#include

#include

using

namespace

std;

int w[105]={},f[105]={},ff[200010]={};

int main()

m*=2;//m是平移的位數

memset(ff,-127/3,sizeof(ff));

ff[m/2]=0;

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

int ans=0,k=m/2;//k是平移的位數

for(int i=0;i<=k;i++)

if(ff[i+k]>=0 && i+ff[i+k]>ans)//ff[i+k]存的是情商,必須判斷非負數,而從0開始的下標保證智商沒負數

ans=i+ff[i+k];i是智商,ff[i+k]是情商

printf("%d",ans);

//fclose(stdin);

// fclose(stdout);

return

0;}

洛谷P2340 奶牛會展

奶牛會展 題目鏈結 由於智商之和或情商之和不能為負數,所以直接把智商 情商 0的奶牛加上是布星的 我們考慮揹包,不妨將智商當做物品大小,將情商當做價值 我們要求 大小 價值 的最大值 dp j 表示智商為 j 時情商的最大值 當智商為負數時,dp j 是會 的,所以我們用 dp j 400040 存...

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 頭奶牛進行 了面試,確定了每頭奶牛的智商和情商。貝西有權選擇讓哪些奶牛參加展覽。由於負的智商或情商會造成負面效果,所以貝西不希望出展奶牛的智商之和小於零,或情商之和小於零。滿足這兩個條件下,她希望出展奶牛的智商與情商之和越大越...