HDU-2017 多校训练赛5-1008-Rikka with Subset

来源:互联网 发布:网络维护外包费用 编辑:程序博客网 时间:2024/06/10 02:31

ACM模版

描述

描述

题解

这个题很明显是 dp,我们从小到大枚举 i,进行判断我们需要加几个 i,用 dp 来维护此时我们能够凑到多少个 i,不够的我们就只能直接添加数 i,因为我们是从小到大枚举的,如果添加小的数不合适,会改变前边的结果,如果添加大的数,又不可能凑出 i。就这样……

代码

#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;}
原创粉丝点击