Vijos P1059 - 积木城堡
传送门
思路
把每个塔能达到的高度全部记录下来,最后扫描一遍,如果数量是n,输出。和上一题有异曲同工之妙
代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MP(a, b) make_pair(a, b)
const int MAXN = 10000 + 10;
const int INF = 0x3f3f3f3f;
int dp[MAXN], ans[MAXN];
int main()
{
//freopen("input.txt", "r", stdin);
int n, i, j, cur, a, vmax = -1;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
cur = 0;
memset(dp, 0, sizeof dp);
while (scanf("%d", &a), a != -1)
{
dp[0] = 1;
for (j = cur; j >= 0; j--)
dp[j + a] |= dp[j];
cur += a;
}
vmax = max(vmax, cur);
for (j = vmax; j >= 1; j--)
dp[j] ? ans[j]++ : 0;
}
for (i = vmax; i >= 1; i--)
if (ans[i] == n)
{
printf("%d\n", i);
return 0;
}
printf("0\n");
return 0;
}