拔河比賽 DP

2021-09-05 15:35:41 字數 1095 閱讀 5199

>description

乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須(且只能夠)在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。

>input

輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n<=100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數(1<=weight<=450)。

>output

輸出資料應該包含兩個整數:分別是兩個組的所有人的體重和,用乙個空格隔開。注意如果這兩個數不相等,則請把小的放在前面輸出。

>sample input

3100

90200

>sample output

190 200

>解題思路

dp解。 f[i][j][k]表示前i個人選j個人為一組,這一組的體重能否達到k。所以f[i][j][k]自然是布林型。

有以下兩種情況:1 (不選第j個人)f[i][j][k]=f[i-1][j][k]

2 (選第j個人)f[i][j][k]=f[i-1][j-1][k-a[j]]

然而f[i][j][k]只跟f[i-1]有關,所以[i]就可以去掉了。變成f[j][k],意思不變。

>**

#include

#include

using namespace std;

int s,m,n,a[

105]

;bool f[

105]

[45005]=

;int main()

for(int i=

1;i<=n;i++

) s=m; m/=2;

for(int i=0;

1;i++

)//i迴圈兩隊之間體重之差

if(f[n/2]

[m-i]

)//小i

}return0;

}

DP 拔河比賽

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

DP 拔河比賽

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

code vs拔河比賽

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入描述 input description 資料的第1行...