采用滚动数组实现。
此外,这题颇有点模拟的味道。
完整代码:
/*0.035s*/
#include<bits/stdc++.h>
using namespace std;
bool dp[205];
vector<int> tmp;///临时数组
int main()
{
int t, m, c, k, cost, i, mx, tmpmx;
bool finalok, ok;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &m, &c);
memset(dp, 0, sizeof(dp));
finalok = dp[tmpmx = 0] = true;
while (c--)
{
scanf("%d", &k);
ok = false;
tmp.clear();
while (k--)
{
scanf("%d", &cost);
if (finalok)
for (i = 0; i <= mx && i + cost <= m; ++i)
if (dp[i]) ok = true, tmpmx = max(tmpmx, i + cost), tmp.push_back(i + cost);
}
mx = tmpmx;
memset(dp, 0, sizeof(dp));
for (i = 0; i < tmp.size(); ++i) dp[tmp[i]] = true;
if (finalok) finalok = ok;
}
if (finalok) printf("%d\n", mx);
else puts("no solution");
}
return 0;
}

本文介绍了一种使用滚动数组实现的算法解决方案,并结合了模拟算法的思想来解决特定问题。通过优化内存使用,此方法能够在限定时间内高效求解复杂问题。
2701

被折叠的 条评论
为什么被折叠?



