CQYZOJ P1392 拔河問題

2022-06-01 19:36:09 字數 2315 閱讀 7751

description

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

input

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

output

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

sample input 1

3

100 90 200

sample output 1
190 200
hint

\(n<=100,1<=weight<=450\)

\(0-1\)揹包

轉換成成乙個花費\(=\)價值的\(0-1\)揹包問題,記\(f[i][j]\)為用前\(i\)個物品,總代價\(<=j\)能取得的最大價值,可得狀態轉移方程:

\[f[i][j]=max(f[i][j],f[i][j]-w[i]]+w[i])

\]最後答案即為\(f[n][sum/2]\),其中\(sum=\sum_^nw[i]\).

實際**中,還可以使用滾動陣列來優化空間.

#includeusing namespace std;

#define maxn 105

#define maxw 45005

int w[maxn],n;

int f[maxw];

int tx=0;

int main()

for(int i=1;i<=n;i++)

for(int p=tx;p;p--)

if(p-w[i]>=0)

f[p]=max(f[p],f[p-w[i]]+w[i]);

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

input

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

output

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

sample input 13

100 90 200

sample output 1
190 200
hint

\(n<=100,1<=weight<=450\)

\(0-1\)揹包

同樣轉換成成乙個花費\(=\)價值的\(0-1\)揹包問題,記\(f[i][j][k]\)為在前\(i\)個物品中選擇\(k\)個,總代價\(<=j\)能取得的最大價值.可得狀態轉移方程:

\[f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-w[i]]+w[i])

\]最終答案即為\(f[n][n/2][sum]\),其中\(sum=\sum_^nw[i]\).

同樣可以採用滾動陣列優化,還要注意初始化邊界.

#includeusing namespace std;

#define inf 0x3f

#define maxn 105

#define maxw 45005

int w[maxn],n;

int f[maxn][maxw];

int tx=0;

int main()

memset(f,-inf,sizeof(f));

for(int i=0;i<=tx>>1;i++)

f[0][i]=0;

for(int i=1;i<=n;i++)

for(int j=i;j>=1;j--)

for(int p=tx>>1;p>=w[i];p--)

f[j][p]=max(f[j][p],f[j-1][p-w[i]]+w[i]);

int ans=f[n>>1][tx>>1];

if(n%2)

ans=max(ans,f[(n>>1)+1][tx>>1]);

cout《還要注意,本題中第三重迴圈必須從\(sum/2\)開始,即**中的

for(int p=tx>>1;p>=w[i];p--)

否則會超時.

kali攻擊139埠 簡易入侵139埠

提到139埠,我想知道的人一定非常多,本來是不想用寫這個教程的,但考慮要照顧到新人,所以還是簡單的寫一下。首先,連線的命令是 netuse ip位址 ipc content lt 空格 密碼 user 使用者名稱 net use 192.168.1.11 ipc content nbsp 12345...

139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典中出現的單詞。說明 示例 1 輸入 s leetcode worddict leet code 輸出 true解釋 返回 true 因為 leetcode 可以被拆分成 leet co...

139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。說明 示例 1 輸入 s leetcode worddict leet code 輸出 true 解釋 返回 true 因為 leetcode 可以被拆分成 leet co...