生日禮物 揹包問題

2021-10-09 12:54:19 字數 1216 閱讀 8943

一對雙胞胎兄妹同一天過生日,這一天,他們的朋友給他倆送來了禮物,每個人送的禮物都是2本書,一本給哥哥,一本給妹妹,但沒有說明哪本是給妹妹的,哪本是給哥哥的,每本書都有自己的價值,為了避免衝突,讓你來分配,要求使得兩人所獲得書本的價值和之間的差距盡可能的小。

例如,有4個禮物:(3,5),(7,11),(8,8),(2,9),可以把3,7,8,2分配給妹妹,其餘的給哥哥,價值差為:5+11+8+9-3-7-8-2=13;如果把3,7,8,9給妹妹,其餘的給哥哥,價值差為:3+7+8+9-5-11-8-2=1,這是最好的方案。

想要使得兩人的價值差最小,就要讓兩個人的價值盡可能的接近。我們先看最差的一種情況,也就是價值差最大的情況,讓其中乙個人每次都拿價值最小的那一本書(這裡假設每次都是哥哥拿價值最少的書)。

對於樣例來說禮物分配完之後哥哥拿的書總價值為3 + 7 + 8 + 2也就是20,而妹妹拿的書的總價值為5 + 11 + 8 + 9也就是33,兩人之間的價值差為13

從圖中不難看出,想要使得兩人最後的總價值盡可能的接近,只需要把妹妹比哥哥多出來的部分盡可能地分一半給哥哥。

把每份禮物中的兩本書的差價當作乙個新的物品,用乙個變數sum記錄所有的差價和(也就是新的物品的價值的和)然後對sum的 一半 跑乙個01揹包就好了

#include using namespace std;

const int n = 45100;

int dp[n], v[n];

int main()

int mm = sum >> 1;

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

for(int j = mm; j >= v[i]; j--)

if(dp[j] < dp[j - v[i]] + v[i])

dp[j] = dp[j - v[i]] + v[i];

cout << abs(m - dp[mm] - dp[mm]);

return 0;

}

單調 生日禮物

luogup2564 題目 小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標 即位置 某些座標上可以沒有彩珠,但多個彩珠也可以出現在同乙個位置上。小布生日快到了,於是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮...

生日禮物(單調佇列)

小西有一條很長的彩帶,彩帶上掛著各式各樣的彩珠。已知彩珠有n個,分為k種。簡單的說,可以將彩帶考慮為x軸,每乙個彩珠有乙個對應的座標 即位置 某些座標上可以沒有彩珠,但多個彩珠也可以出現在同乙個位置上。小布生日快到了,於是小西打算剪一段彩帶送給小布。為了讓禮物彩帶足夠漂亮,小西希望這一段彩帶中能包含...

1005 生日禮物

題目描述 description 輸入描述 input description 輸入的第一行包含2個整數n 1 n 8 m 1 m 10 表示有n種不同型別的本子和m種小寒喜歡的顏色。接下來乙個n m的矩陣。第i行第j列的整數aij表示在第i種型別的本子中包含小寒喜歡的顏色j的紙有aij 1 aij...