SRM 651 Div2M: FoxAndSouvenirTheNext (動的計画法)
問題
おみやげがN個あり、それぞれvalue[i]の価値がある。2人におみやげの数が同じようになるように分けた時、価値の合計値が同じになるように分けることは可能か判定せよ。
解法
DPで[N/2][sum/2]の状態に到達可能か判定する。
コード
public class FoxAndSouvenirTheNext { public String ableToSplit(int[] value) { int N = value.length; if (N % 2 != 0) { return "Impossible"; } int sum = 0; for (int i : value) { sum += i; } if (sum % 2 != 0) { return "Impossible"; } boolean[][] dp = new boolean[N + 1][sum + 1]; dp[0][0] = true; for (int i = 0; i < N; i++) { for (int x = i; x >= 0; x--) { for (int v = sum; v >= 0; v--) { if (dp[x][v]) { dp[x + 1][v + value[i]] = true; } } } } if (dp[N / 2][sum / 2]) { return "Possible"; } else { return "Impossible"; } } }