参考http://blog.csdn.net/qq_36368339/article/details/76934053
Sample Input
2
2 3
1 1 1 1
3 3
1 3 3 1
Sample Output
1 2
1 1 1
Hint
In the first sample, A is [1,2]. A has four subsets [],[1],[2],[1,2] and the sums of each subset are 0,1,2,3. So B=[1,1,1,1]
题意:接下来一行n和m,下面一行m+1个数字代表B(0~m)求A序列,Bi 代表A序列中的所有子集之和为i的有Bi个,A序列总和为m,n个
int a[max_n], b[max_n], dp[max_n], c[max_n];
//dp[i]表示:加和为i的子集个数;
int main() {
int t, n, m;
scanf("%d", &t);
while(t--) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(dp, 0, sizeof(dp));
scanf("%d %d", &n, &m);
for(int i = 0; i <= m; i++)
scanf("%d", &b[i]);
dp[0] = 1; //初始化值
int p = 0, sum = 0;
for(int i = 1; i <= m; i++) {
c[i] = b[i] - dp[i];//A序列中值为i的个数
for(int j = 0; j < c[i]; j++) {
a[p++] = i; //对A序列赋值
for(int k = m; k>= i; k--) { //处理成01背包
dp[k] += dp[k - i]; //和为k的A子集个数相加去更新B序列
}
}
}