01揹包
一對雙胞胎兄妹同一天過生日,這一天,他們的朋友給他倆送來了禮物,每個人送的禮物都是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,這是最好的方案。
輸入的第一行包含一個正整數N,表示禮物的數量,接下來N行,每行兩個整數,表示每份禮物兩本書的價值(價值範圍在1到300之間)。
N≤150
輸出包含一個非負整數,表示最小的價值差。
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = 150+5;
int n, a[maxn], x, y, dp[450000], t;
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x, &y);
a[i] = abs(x-y);
t += a[i];
}
int m = t/2;
for(int i = 0; i < n; i++)
{
for(int j = m; j >= a[i]; j--)
{
if(dp[j-a[i]]+a[i] > dp[j])
{
dp[j] = dp[j-a[i]]+a[i];
}
}
}
printf("%d", abs(t-dp[m])-dp[m]);
return 0;
}