拔河比賽

時間限制: 1 s空間限制: 128000 KB題目等級 : 黃金 Gold app

題目描述 Description

一個學校舉行拔河比賽,全部的人被分紅了兩組,每一個人必須(且只可以)在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的全部人體重加起來儘量地接近。spa

輸入描述 Input Description

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

輸出描述 Output Description

包含兩個整數:分別是兩個組的全部人的體重和,用一個空格隔開。注意若是這兩個數不相等,則請把小的放在前面輸出。blog

樣例輸入 Sample Input

3
100
90
200ip

樣例輸出 Sample Output

190 200io

思路

這個題真的畫風清奇;
明明不是不知足動態規劃的最優子結構,倒是個動態規劃題;
f[i][j]==1表示i我的能夠的體重和爲j.
 

代碼實現

 1 #include<cstdio>
 2 int n,tt,tot,ans;
 3 int s[101];
 4 int f[101][30001];
 5 int main(){
 6     scanf("%d",&n),tt=(n+1)/2;
 7     for(int i=1;i<=n;i++) scanf("%d",&s[i]),tot+=s[i];
 8     f[0][0]=1,ans=tot/2;
 9     for(int i=1;i<=n;i++)
10     for(int j=tt;j>=0;j--)
11     for(int k=0;k<=ans;k++)
12     if(f[j][k]) f[j+1][k+s[i]]=1;
13     for(int i=ans;i>=0;i--)
14     if(f[tt][i]||f[tt-1][i]){ans=i;break;}    
15     printf("%d %d\n",ans,tot-ans);
16     return 0;
17 }
相關文章
相關標籤/搜索