rt,感觉考虑的情况应该足够了
input:
10
0 1 5 2 0
6 0 0 2 0
0 4 2 3 0
1 4 1 1 1
0 2 4 0 6
0 5 1 1 0
3 2 1 2 2
2 4 0 4 0
2 3 1 1 1
1 2 3 0 2
正确输出:
8
8
11
10
22
4
16
13
10
12
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define stat dp[i][j][k][p][q]
int arr[105];
//第 i 个结尾,4人间用了 j 个,6 人间用了 k 个
//最后一个4人间剩下 p 个位置,最后一个6人间剩下q个位置
int dp[105][105][105][5][7];
int main() {
int _;
scanf("%d", &_);
while (_--) {
int n = 0;
for (int i = 2; i <= 4; i++) {
int cnt;
scanf("%d", &cnt);
while (cnt--) arr[n++] = i;
}
int a, b;
scanf("%d%d", &a, &b);
memset(dp, 0, sizeof dp);
int ans = 0;
for (int i = 0; i < n; i++) {
int ai = arr[i];
for (int j = 0; j <= a; j++)
for (int k = 0; k <= b; k++)
for (int p = 0; p <= 4; p++)
for (int q = 0; q <= 6; q++) {
//开一个新的4人房间
dp[i + 1][j + 1][k][4 - ai][q] = max(dp[i + 1][j + 1][k][4 - ai][q],
stat + ai);
//开一个新的6人房间
dp[i + 1][j][k + 1][p][6 - ai] = max(dp[i + 1][j][k + 1][p][6 - ai],
stat + ai);
//如果当前4人房还有空位
if (j && ai <= p)
dp[i + 1][j][k][p - ai][q] = max(dp[i + 1][j][k][p - ai][q],
stat + ai);
//如果当前6人房还有空位
if (k && ai <= q)
dp[i + 1][j][k][p][q - ai] = max(dp[i + 1][j][k][p][q - ai],
stat + ai);
dp[i + 1][j][k][p][q] = max(dp[i + 1][j][k][p][q], stat);
ans = max(ans, dp[i][j][k][p][q]);
printf("[%d %d %d %d %d] = %d\n", i, j, k, p, q, stat);
}
}
for (int j = 0; j <= a; j++)
for (int k = 0; k <= b; k++)
for (int p = 0; p <= 4; p++)
for (int q = 0; q <= 6; q++)
ans = max(ans, dp[n][j][k][p][q]),
printf("[%d %d %d %d %d] = %d\n", n, j, k, p, q, dp[n][j][k][p][q]);
printf("%d\n", ans);
}
return 0;
}