題目:給你一些四元組<a, b, c, s>,s为得分,a,b,c為三個元素,從這些四元組中取出3個使得元素分別不同;
問三組得分的和哦最大值,如果不存在輸出-1.
分析:枚舉,搜索,回溯。數據量較小,直接dfs回溯即可。
說明:最近好忙,都沒怎麼刷題╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
int a[81], b[81], c[81], s[81];
int visit[81], same[10];
int dfs(int v, int k, int n, int d)
{
if (d == 3) return v;
int max = -1, value;
for (int i = k; i < n; ++ i)
if (!visit[i] && !same[a[i]] && !same[b[i]] && !same[c[i]]) {
visit[i] = 1;
same[a[i]] = same[b[i]] = same[c[i]] = 1;
value = dfs(v+s[i], i+1, n, d+1);
if (max < value) max = value;
same[a[i]] = same[b[i]] = same[c[i]] = 0;
visit[i] = 0;
}
return max;
}
int main()
{
int n, cases = 1;
while (~scanf("%d",&n) && n) {
for (int i = 0; i < n; ++ i)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&s[i]);
printf("Case %d: %d\n",cases ++, dfs(0, 0, n, 0));
}
return 0;
}