TopCoder SRM 651 Div2 Problem 500 - FoxAndSouvenirTheNext (DP)

题意

问能不能选出n/2个数,使得她们的和为sum/2。

思路

就是说n/2个数能不能凑出sum/2。

用完全背包。

$dp[i][j] = dp[i-1][j-v[n]]$
意思是前n个里选i个能凑出j,当前n个选i-1个里能凑出j-v[n]。

代码

class FoxAndSouvenirTheNext {
public:
    int dep, sum;
    int dp[55][3000];
    string ableToSplit(vector<int> v) {
        if (SZ(v) & 1) return "Impossible";
        v.insert(v.begin(), -1);
        sum = 0;
        dp[0][0] = 1;
        for (int i = 1; i < SZ(v); i++) sum += v[i];
        if (sum & 1) return "Impossible";
        sum /= 2;
        for (int i = 1; i < SZ(v); i++)
        {
            for (int j = i; j > 0; j--)
            {
                for (int k = MAXN; k >= v[i]; k--)
                    if (!dp[j][k] && dp[j-1][k-v[i]]) dp[j][k] = 1;
            }
        }
        return dp[SZ(v)/2][sum] ? "Possible" : "Impossible";
    }
};

Powered by Jekyll and Theme by solid