描述
题解
这个题很明显是 dp ,我们从小到大枚举 i ,进行判断我们需要加几个 i,用 dp 来维护此时我们能够凑到多少个 i ,不够的我们就只能直接添加数 i,因为我们是从小到大枚举的,如果添加小的数不合适,会改变前边的结果,如果添加大的数,又不可能凑出 i <script type="math/tex" id="MathJax-Element-155">i</script>。就这样……
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 55;
const int MAXM = 1e4 + 10;
int n, m;
int A[MAXN];
int B[MAXM];
int tp[MAXM];
int dp[MAXM];
void solve()
{
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int cnt = 1;
for (int i = 1; i <= m; i++)
{
tp[i] = B[i] - dp[i];
for (int j = 0; j < tp[i]; j++)
{
A[cnt++] = i;
for (int k = m; k >= i; k--)
{
dp[k] += dp[k - i];
}
}
}
}
int main(int argc, const char * argv[])
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i <= m; i++)
{
scanf("%d", B + i);
}
solve();
for (int i = 1; i <= n; i++)
{
printf("%d%c", A[i], i == n ? '\n' : ' ');
}
}
return 0;
}