题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092
题意:Bi 代表A序列中的所有子集之和为i的有Bi个,然后求出A序列。
思路:可以把这个当做01背包,把m当做容量,从小的开始扫,每次扫一个数字,去更新比自己大的数字,注意数组不要写成long long,不然会TLE。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[10005],a[10005],b[10005],c[10005];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
int i,j,k;
for(i=0;i<=m;i++)
{
scanf("%lld",&b[i]);
}
memset(dp,0,sizeof(dp));
memset(c,0,sizeof(c));
dp[0]=1;
int z=0;
for(i=1;i<=m;i++)
{
c[i]=b[i]-dp[i];
for(j=1;j<=c[i];j++)
{
a[z++]=i;
for(k=m;k>=i;k--)
{
dp[k]+=dp[k-i];
}
}
}
for(i=0;i<z;i++)
{
if(i)printf(" %lld",a[i]);
else printf("%lld",a[i]);
}
cout<<endl;
}
return 0;
}