1. 程式人生 > >貓狗大戰

貓狗大戰

IT img 以及 給定 || 足夠 span 星際 技術分享

技術分享圖片
新一年度的貓狗大戰通過SC(星際爭霸)這款經典的遊戲來較量,野貓和飛狗這對冤家為此已經準備好久了,為了使戰爭更有難度和戲劇性,雙方約定只能選擇Terran(人族)並且只能造機槍兵。
比賽開始了,很快,野貓已經攢足幾隊機槍兵,試探性的發動進攻;然而,飛狗的機槍兵個數也已經不少了。野貓和飛狗的兵在飛狗的家門口相遇了,於是,便有一場腥風血雨和陣陣慘叫聲。由於是在飛狗的家門口,飛狗的兵補給會很快,野貓看敵不過,決定撤退。這時飛狗的兵力也不足夠多,所以沒追出來。
由於不允許造醫生,機槍兵沒辦法補血。受傷的兵只好忍了。555-
現在,野貓又攢足了足夠的兵力,決定發起第二次進攻。為了使這次進攻給狗狗造成更大的打擊,野貓決定把現有的兵分成兩部分,從兩路進攻。由於有些兵在第一次戰鬥中受傷了,為了使兩部分的兵實力平均些,分的規則是這樣的:
1)兩部分兵的個數最多只能差一個;2)每部分兵的血值總和必須要盡可能接近。現在請你編寫一個程序,給定野貓現在有的兵的個數以及每個兵的血格值,求出野貓按上述規則分成兩部分後每部分兵的血值總和。 輸入輸出格式 輸入格式: 第一行為一個整數n(1<=n<=200),表示野貓現在有的機槍兵的個數。以下的n行每行一個整數,表示每個機槍兵的血格(1<=ai<=40)。 輸出格式: 一行,為兩個整數,表示分成兩部分後每部分兵的血值總和 輸入輸出樣例 輸入樣例#13 35 20 32 輸出樣例#135 52
題目描述

解:每部分兵力最多為100人,

血格值最多為100*40=4000,

我們可以進行背包,預處理出

i個人能夠構成的所有血格值j,即f[j][i]

然後按照已經得到的f[j][i],枚舉第一部分的血格值,

從而得到最優解。

技術分享圖片
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<queue>
 8 #define inf 100000000
 9 using namespace
std; 10 int n,f[80010][200]; 11 int sum,ans1,ans2; 12 int main() 13 { 14 scanf("%d",&n); 15 f[0][0]=1; 16 for(int i=1,x;i<=n;++i) 17 { 18 scanf("%d",&x); 19 for(int j=8000;j>=x;--j) 20 for(int k=100;k>=1;--k) 21 f[j][k]=f[j][k]||f[j-x][k-1]; 22 sum+=x; 23 } 24 int dep=1e9; 25 for(int j=sum;j>=0;--j) 26 if(f[j][n/2] && f[sum-j][n-n/2]) 27 { 28 int l=min(j,sum-j),r=max(j,sum-j); 29 if(r-l<dep) ans1=l,ans2=r,dep=r-l; 30 } 31 cout<<ans1<<" "<<ans2; 32 return 0; 33 }
View Code

貓狗大戰