您的位置:首页 > 其它

hdu 6092 Rikka with Subset

2017-08-08 17:05 405 查看
传送门

一个An序列,n个数,那么我所有的情况一定是2^n。而且首尾一定是都不取或者取为1,不取就是0的情况为1,尾为1是把所有数都加起来肯定是1,中间的情况就得慢慢判了。从左到右开始,跳过首来到第二个位置,这个位置一定是这个串中最小的一个数,只可能是1的情况。有多少个就是1的数字有多少个。来到第三个位置,这个数可能是

这个串第二小的数也就是2,或者是由2个1构成得到,再往右走可能是第三小的数也可能是之前的数加起来得到,比如3,可能我由1个3得到,也可能由1 1 1,1 2 得到。所

以你会从左递推得出最后的串,然后仔细想想是个背包吧?(xgg说是个背包,逃。  然后写了一下过了


Rikka with Subset

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 231    Accepted Submission(s): 99


Problem Description

As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

Yuta has n positive A1−An and
their sum is m.
Then for each subset S of A,
Yuta calculates the sum of S. 

Now, Yuta has got 2n numbers
between [0,m].
For each i∈[0,m],
he counts the number of is
he got as Bi.

Yuta shows Rikka the array Bi and
he wants Rikka to restore A1−An.

It is too difficult for Rikka. Can you help her?  

 

Input

The first line contains a number t(1≤t≤70),
the number of the testcases. 

For each testcase, the first line contains two numbers n,m(1≤n≤50,1≤m≤104).

The second line contains m+1 numbers B0−Bm(0≤Bi≤2n).

 

Output

For each testcase, print a single line with n numbers A1−An.

It is guaranteed that there exists at least one solution. And if there are different solutions, print the lexicographic minimum one.

 

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]$

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <climits>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e4 + 5;
const int mod = 1e9 + 7;
const int INF = 1e8 + 5;
const ll inf = 1e15 + 5;
const db eps = 1e-6;
int n, m;
int b[maxn];

void solve() {
cin >> n >> m;
for (int i = 0; i <= m; i++)
scanf("%d", b + i);
int c[maxn] = {0}; c[0] = 1;
vector<int> v;
for (int i = 1; i <= m; i++) {
while (c[i] < b[i]) {
v.push_back(i);
for (int j = m - i; j >= 0; j--) {
c[j+i] += c[j];
}
//for (int j = 0; j <= m; j++)
//      cout << c[j] << ' ';
//  cout << endl;
}
}
for (int i = 0; i < v.size(); i++)
printf("%d%c", v[i], i == v.size() - 1 ? '\n' : ' ');
}
int main() {
int t = 1, cas = 1;
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &t);
while(t--) {
// printf("Case %d: ", cas++);
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: