dp專題 拔河

2021-08-14 10:44:30 字數 950 閱讀 4614

小明班裡要舉行一次拔河比賽,班主任決定將所有人分為兩隊,每個人都必須參加。兩個隊伍的人數之差不能超過1,並且兩個隊伍的體重之和要盡可能相近,當然相同是最好的了。

輸入包含多組測試資料。

每組輸入的第一行是乙個正整數n(2<=n<=100),表示共有n個人。

接下來n行,每行輸入乙個整數w(1<=w<=450),表示每個人的體重。

對於每組輸入,分別輸出兩個隊伍的體重之和,按公升序排序。

3100

90200

190 200

題解:這道題網上的**大多是錯的,他們基本上用了01揹包,把所有人數重量的一半作為揹包的容量,如何使揹包價值最大如何就最接近二堆人數重量最接近,但是他們都沒有考慮人數的限制,二堆人的人數必須小於等於1。

不過同樣是用01揹包寫的,但是需要加乙個個數上的限制,以前寫01揹包有二種方法,一種是用滾動陣列寫的還有一種使用二維陣列寫的,這裡我們就用二維陣列的思想,把第一維陣列來區分每個狀態,如果你限制了有幾個狀態不就是最多能放幾次嗎,還需要限制的是,你必須每次都放,不然如果你允許了最多放幾次,但是還是存在小於這個次數就達到最多狀態的,所以每次放你都需要在上一次放過的狀態下才能放;

#include #include #define maxn 500+1

int dp[55][55*510]=;

int p[maxn]=;

int min(int a,int b)

int main()

int n=n/2+(n%2==0?0:1);

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

}int w;

for(int i=sum/2;i>=0;i--)

}int qq;

if(w>sum-w)

else

printf("%d %d\n",qq,w);

}return 0;

}

拔河比賽 DP

description 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的...

DP 拔河比賽

乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數 1 wei...

DP 拔河比賽

乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數 1 weight 45...