【問題描述】
學校決定舉行一次全校性的拔河比賽,以班為單位組隊。我們知道影響拔河比賽勝負的因素有:參賽隊的合力量、總重量和技巧。如果每只隊伍的人數都一樣的話,那麼低年級的班級會沒有獲勝的希望。因此學校考慮到比賽公平性和參與的廣泛性,做出如下規定:
◆ 每只隊伍的人數不一定相同,但隊員的總重量不能超過某個規定的值。
◆ 每只隊伍的女隊員必須達到一定的人數。
多多是高二x班的體育委員,班主任將本班組隊的任務交給了他。多多深知影響比賽勝敗的三個關鍵因素中力量和重量是前提,技巧靠後期訓練。因此他必須先考慮在學校規定的前提下,選那些同學才能獲得最大的合力量。
【輸入格式】
第一行3個數整數:分別表示隊員總重量上限w(<=4000)、多多班上學生總人數n(<=60)、女同學人數m(<=30);
第2行乙個整數,表示參賽隊中必須達到的女隊員人數k(<=10);
接下來n行每行2個整數,分別表示多多班上每個同學的重量和力量,其中第3到m+2行是所有女生的重量和力量,第m+3到n+2行表示所有男同學的重量和力量,每個整數在60至180之間。
【輸出格式】
一行乙個整數,合力量的最大值。
【輸入樣例】
400 10 3
2 90 120
80 90
100 150
110 80
150 100
120 80
90 80
80 70
120 100
110 90
【輸出樣例】
【資料範圍】
共10組測試資料:(每組測試正確得10分,共100分)
對於前3組資料有n<=20、m<=10、w<=1000;
對於前5組資料有n<=30、m<=15、w<=2000;
對於前10組資料有n<=60、m<=25、w<=4000;
【題解】
窮舉 + 0/1揹包類的動態規劃
動態規劃計算,從m個女生中選擇至少k個女生,體重和不超過t的情況下所能獲得的最大力量:p1
動態規劃計算,從n-m個男生中選擇一些,體重和不超過w-t的情況下所能獲得的最大力量:p2
女 d1:設定狀態函式f(m,k,w)=前m個女生,選擇k個女生,在體重和不超過w的情況下,所能得到的最大力量和(可用滾動陣列)
男 d2:設定狀態函式f(n,w)=前n個男生中選擇一些,在體重和不超過w的情況下,所能得到的最大力量和(可用滾動陣列)
把女生和男生分開來分析:
隊伍的體重和不超過w,把這個w分成兩部分:女生體重和不超過t,男生體重和不超過w-t,因此可以窮舉t,然後p1、p2呼叫生成好的d1、d2。
#include
#include
#define maxn 2000
#define oo 1000000000
using
namespace
std;
int w,n,m,k,x,y,ans=-oo;
int gw[maxn],gp[maxn],bw[maxn],bp[maxn];
int girl[50][50][4005]=,boy[65][4005]=;
void read(int &x)
}void in()
for(int i=1;i<=n-m;i++)
}void ****1()
}void ****2()
}void task()
printf("%d",ans);
}int main()
code vs拔河比賽
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入描述 input description 資料的第1行...
拔河比賽 DP
description 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的...
DP 拔河比賽
乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數 1 wei...