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