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

luogu P1489 貓狗大戰

經典 main while 輸出格式 badge 輸入格式 pan for getch

題目描述

新一年度的貓狗大戰通過SC(星際爭霸)這款經典的遊戲來較量,野貓和飛狗這對冤家為此已經準備好久了,為了使戰爭更有難度和戲劇性,雙方約定只能選擇Terran(人族)並且只能造機槍兵。

比賽開始了,很快,野貓已經攢足幾隊機槍兵,試探性的發動進攻;然而,飛狗的機槍兵個數也已經不少了。野貓和飛狗的兵在飛狗的家門口相遇了,於是,便有一場腥風血雨和陣陣慘叫聲。由於是在飛狗的家門口,飛狗的兵補給會很快,野貓看敵不過,決定撤退。這時飛狗的兵力也不足夠多,所以沒追出來。

由於不允許造醫生,機槍兵沒辦法補血。受傷的兵只好忍了。555-

現在,野貓又攢足了足夠的兵力,決定發起第二次進攻。為了使這次進攻給狗狗造成更大的打擊,野貓決定把現有的兵分成兩部分,從兩路進攻。由於有些兵在第一次戰鬥中受傷了,為了使兩部分的兵實力平均些,分的規則是這樣的:1)兩部分兵的個數最多只能差一個;2)每部分兵的血值總和必須要盡可能接近。現在請你編寫一個程序,給定野貓現在有的兵的個數以及每個兵的血格值,求出野貓按上述規則分成兩部分後每部分兵的血值總和。

輸入輸出格式

輸入格式:

第一行為一個整數n(1<=n<=200),表示野貓現在有的機槍兵的個數。以下的n行每行一個整數,表示每個機槍兵的血格(1<=ai<=40)。

輸出格式:

一行,為兩個整數,表示分成兩部分後每部分兵的血值總和

輸入輸出樣例

輸入樣例#1: 復制
3
35
20
32
輸出樣例#1: 復制
35 52

說明

TO 狗狗:這道題的數據範圍我已經盡量按星際的遊戲規則來了,如果你再固執於由於機槍兵的攻擊力一定使不能達到某些血格值或者遊戲中一定要造農民不能使機槍兵的人數達到200的話,我只能決定將那場貓狗大戰的錄像公開於世人了!!!

dp[i][j]標識選取i個數能否構成血量為j

轉移類似背包

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 207;
int n,thi[maxn];
inline int read() {
    int x=0,    f=1;
    char c=getchar() ;
    while(c<0||c>9){ if(c==-)f=-1;c=getchar();};
    while(c<=9&&c>=
0)x=x*10+c-0,c=getchar(); return x*f; } int f[maxn][maxn*40]; int main() { n=read();int tot=0; for(int i=1;i<=n;++i) thi[i]=read(),tot+=thi[i]; //f[0][0][0]=1; f[0][0]=1; /* for(int i=1;i<=n;++i) { f[1][thi[i]]=1; }*/ for(int i=1;i<=n;++i) for(int j=i;j>=1;j--) for(int k=tot;k>=thi[i];k--) { f[j][k]|=f[j-1][k-thi[i]]; } int t=n>>1; int ans=0; for(int i=tot/2;i>=0;i--) { if(f[t][i]){ans=i;break;} } printf("%d %d\n",ans,tot-ans); return 0; }

luogu P1489 貓狗大戰