close

題目連結:   https://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=24943

題目大意:  問2個人拿古董,價值相差最小為多少

思路:  01背包問題,用一個陣列紀錄那些重量可以達到,每個古董都放,放這個古董的話dp[價值-古董價值]為True,則這個價值為True。基底價值0為True.

之後枚舉全部重量看那些能達到,計算最小差。這題竟然是困難(?),感覺跟前面題型都差不多。

代碼:  

#include <bits/stdc++.h>
#define N 55
using namespace std;

int arr[N];
int main()
{
    int n, k;
    cin >> n;
    while(n--){
        bool dp[N*10000] = {};
        cin >> k;
        int sum = 0;
        for(int i = 0; i < k; ++i){
            cin >> arr[i];
            sum += arr[i];
        }
        dp[0] = 1;
        for(int i = 0; i < k; ++i){
            for(int j = sum; j >= arr[i]; --j){
                dp[j] |= dp[j-arr[i]];
            }
        }
        int mn = INT_MAX;
        for(int i = 1; i <= sum; ++i){
            if(dp[i]) mn = min(abs(i - (sum-i)), mn);
        }
        cout << mn << endl;
    }
    return 0;
}

arrow
arrow
    創作者介紹
    創作者 尾玉 的頭像
    尾玉

    louisfghbvc的部落格

    尾玉 發表在 痞客邦 留言(0) 人氣()