题解:UVA10482 The Candyman Can

· · 题解

题意

给你 n 个数,分成 3 组,输出最大的那一组与最小的那一组的差的最小值。

思路

代码

#include <bits/stdc++.h>
using namespace std;
int T, n, p, a[100], dp[650][650];
int main() {
    cin >> T;
    while(T--) {
        p++;
        cin >> n;
        int sum = 0;
        for(int i = 1; i <= n; i++) {
            cin >> a[i];
            sum += a[i];
        }
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for(int i = 1; i <= n; i++) {
            for(int j = sum; j >= a[i]; j--) {
                for(int k = 0; k <= sum; k++) {
                    if(dp[j - a[i]][k] == 1) {
                        dp[j][k] = 2;
                    }
                }
            }
            for(int j = sum; j >= a[i]; j--) {
                for(int k = 0; k <= sum; k++) {
                    if(dp[k][j - a[i]] == 1) {
                        dp[k][j] = 2;
                    }
                }
            }
            for(int j = 0; j <= sum; j++) {
                for(int k = 0; k <= sum; k++) {
                    if(dp[j][k] == 2) {
                        dp[j][k] = 1;
                    }
                }
            }
        }
        int minn = 1e9;
        for(int i = 0; i <= sum; i++) {
            for(int j = 0; j <= sum; j++) {
                if(dp[i][j]) {
                    int k = sum - i - j;
                    minn = min(minn, abs(max(i, max(j, k)) - min(i, min(j, k))));
                }
            }
        }
        cout<<"Case "<<p<<": "<<minn<<endl;
    }
    return 0;
}