生日禮物


01揹包

Problem Description

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


Input

輸入的第一行包含一個正整數N,表示禮物的數量,接下來N行,每行兩個整數,表示每份禮物兩本書的價值(價值範圍在1到300之間)。

N≤150

Output

輸出包含一個非負整數,表示最小的價值差。


#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章