版权声明:欢迎大家转载,转载请注明出处 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;
}