题目链接
https://atcoder.jp/contests/abc119/tasks/abc119_c
思路
为了凑成三个竹节,我不知道该使用哪些怎么竹节,于是乎枚举所有情况,时间复杂度 O ( 2 n ∗ 2 n ∗ 2 n ) O(2^n*2^n*2^n) O(2n∗2n∗2n)。
AC代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 8 + 2;
int len[maxn], vis[maxn];
int n, goal[3], better, sum[3], comp[3];
int cost[3][1<<maxn];
bool addVis(int u, int p) {
int i = 0, cnt = 0, tol = 0;
while(p > 0) {
if(p & 1) {
vis[i]++;
cnt++;
tol += len[i];
}
p >>= 1;
if(vis[i] > 1) return false;
i++;
}
comp[u] = cnt;
sum[u] = tol;
return true;
}
int main() {
while (scanf("%d", &n) == 1) {
for (int i = 0; i < 3; i++)
scanf("%d", &goal[i]);
for (int i = 0; i < n; i++) {
scanf("%d", &len[i]);
}
better = INF;
for(int i = 1; i < (1 << n); i++) {
memset(vis, 0, sizeof(vis));
if(!addVis(0, i)) continue;
for(int j = 1; j < (1<< n); j++) {
if(!addVis(1, j)) continue;
for(int k = 1; k < (1<< n); k++) {
if(!addVis(2, k)) continue;
int tol = 0;
for(int x = 0; x < 3; x++) {
tol += (comp[x] - 1) * 10;
tol += fabs(sum[x] - goal[x]);
}
printf("tol = %d\n", tol);
better = min(better, tol);
}
}
}
printf("%d\n", better);
}
return 0;
}
如有不当之处欢迎指出!