一對雙胞胎兄妹同一天過生日,這一天,他們的朋友給他倆送來了禮物,每個人送的禮物都是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...