hdu 6092 Rikka with Subset

来源:互联网 发布:网络推广是做什么的 编辑:程序博客网 时间:2024/05/20 20:19

题意:给你一个B数组,m+1个数,分别代表区间【0,m】的对应下标位置的数量,一共有2^n个数,B数组是A数组的所有集合的和的映射,求A数组。

#include <bits/stdc++.h>const int MAXN = 100005;using namespace std;typedef long long LL;inline int read(){    int f=1, x=0;    char ch = getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-') f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    return f*x;}int num[MAXN];int ans[55];int dp[MAXN];int main(){    int t;    int n, m;    scanf("%d", &t);    while(t--)    {        scanf("%d %d", &n,&m);        memset(dp, 0, sizeof(dp));        for(int i=0; i<=m; ++i)            scanf("%d", &num[i]);        int cnt=0;        dp[0]=1;//不可缺少        for(int i=1; i<=m; ++i)        {            int d=num[i]-dp[i];            for(int j=1; j<=d; ++j)            {                ans[cnt++]=i;                for(int k=m; k>=i; --k)//求01背包的模板,求出对于每一个重量m,能够到达其的方案数                {                    dp[k]+=dp[k-i];                }            }        }        for(int i=0; i<cnt; ++i)            printf("%d%c", ans[i], i==cnt-1?'\n':' ');    }    return 0;}
原创粉丝点击