uva 1508 Equipment(暴力+枚举子集)

uva 1508 Equipment

题目大意:给出n个5元组,要求从中选取k个,要求5个位置上的数的最大值的和尽量大。

解题思路:一开始没思路,看别人题解过的。5位可以组成32种情况,在DFS前预处理,找出32种情况在n组数据中的最大值,,然后将这组数据带入DFS中枚举计算。

#include<stdio.h>#include<string.h>#include<algorithm>#include<stdlib.h>using namespace std;int num[10005][6], temp[40], ans, n, k;void DFS(int pos, int sum, int d) {if (d == k) {ans = max(sum, ans);return;}for (int i = pos; i; i = (i – 1) & pos) {DFS(pos^i , sum + temp[i], d + 1);}return;}int main() {int T;scanf("%d\n", &T);while (T–) {memset(num, 0, sizeof(num));memset(temp, 0, sizeof(temp));scanf("%d %d\n", &n, &k);for (int i = 0; i < n; i++) {for (int j = 0; j < 5; j++) {scanf("%d", &num[i][j]);temp[j] = max(temp[j], num[i][j]);}}if (k >= 5) {printf("%d\n", temp[0] + temp[1] + temp[2] + temp[3] + temp[4]);continue;}memset(temp, 0, sizeof(temp));for (int i = 0; i < n; i++) {for (int pos = 0; pos < 32; pos++) { //5位32种情况int sum = 0;for (int j = 0; j < 5; j++) {if (pos & (1<<j)) {sum += num[i][j];}}temp[pos] = max(temp[pos], sum); //32种情况,每种情况的最大值}}ans = 0;DFS(31, 0, 0);printf("%d\n", ans);}return 0;}

当一个人真正觉悟的一刻,他放弃追寻外在世界的财富,

uva 1508 Equipment(暴力+枚举子集)

相关文章:

你感兴趣的文章:

标签云: