UVALive 4794 Sharing Chocolate——dp

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/81988903
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool judge[(1<<15)+10];
int kase, N, X, Y, a[20], sum[(1<<15)+10];
bool vis[110][(1<<15)+10], dp[110][(1<<15)+10];
bool dfs(int x, int s) {
    if (vis[x][s]) return dp[x][s];
    vis[x][s] = 1;
    if (judge[s]) return dp[x][s] = 1;
    int y = sum[s] / x;
    for (int i = (s-1)&s; i; i = (i-1)&s) {
        if (sum[i] % x == 0 && dfs(min(x, sum[i]/x), i) && dfs(min(x, sum[i^s]/x), s^i)) return dp[x][s] = 1;
        if (sum[i] % y == 0 && dfs(min(y, sum[i]/y), i) && dfs(min(y, sum[i^s]/y), s^i)) return dp[x][s] = 1;
    }
    return dp[x][s] = 0;
}
int main() {
    for (int i = 0; i <= 15; i++) judge[1<<i] = 1;
    while (~scanf("%d", &N) && N) {
        scanf("%d%d", &X, &Y);
        int t = 0;
        for (int i = 0; i < N; i++) {
            scanf("%d", &a[i]);
            t += a[i];
        }
        for (int i = 0; i < (1<<N); i++) {
            sum[i] = 0;
            for (int j = 0; j < N; j++) {
                if (i & (1<<j)) sum[i] += a[j];
            }
        }
        for (int i = 0; i <= X; i++) for (int j = 0; j < (1<<N); j++) vis[i][j] = dp[i][j] = 0;
        printf("Case %d: ", ++kase);
        if (t == X*Y && dfs(min(X, Y), (1<<N)-1)) puts("Yes");
        else puts("No");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/81988903