小明班裡要舉行一次拔河比賽,班主任決定將所有人分為兩隊,每個人都必須參加。兩個隊伍的人數之差不能超過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...