題目:9個人去KTV,3人一組,有個組合列表,每個不同的組合有不同的得分,
沒有的組合不合法,能組成組合的最大得分(沒有輸出-1)。
分析:搜索。利用dfs生成1-9的全排列枚舉即可,組合列表直接打成表查詢。
說明:因為組合數不多,也可以搜索組合,找到三組不互相覆蓋的組合即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int group[10][10][10];
int visit[10], save[10];
int dfs(int d)
{
if (d == 3 && group[save[0]][save[1]][save[2]] == -1) { // 剪枝
return -1;
}
if (d == 6 && group[save[3]][save[4]][save[5]] == -1) { // 剪枝
return -1;
}
if (d == 9) {
int ans = 0;
for (int i = 0; i < 3; ++ i) {
if (group[save[3*i]][save[3*i+1]][save[3*i+2]] == -1) {
return -1;
}
ans += group[save[3*i]][save[3*i+1]][save[3*i+2]];
}
return ans;
}
int ans = -1, value = -1;
for (int i = 1; i <= 9; ++ i) {
if (!visit[i]) {
visit[i] = 1;
save[d] = i;
value = dfs(d+1);
if (ans < value) {
ans = value;
}
visit[i] = 0;
}
}
return ans;
}
int main()
{
int a, b, c, s, n, cases = 1;
while (~scanf("%d",&n) && n) {
memset(group, -1, sizeof(group));
for (int i = 0; i < n; ++ i) {
scanf("%d%d%d%d",&a,&b,&c,&s);
group[a][b][c] = s;
}
printf("Case %d: %d\n",cases ++,dfs(0));
}
return 0;
}