hdu6092 01背包
阿新 • • 發佈:2017-08-08
eof store array 背包 accep mathjax ins mis ati
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 i s 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?
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) .
It is guaranteed that there exists at least one solution. And if there are different solutions, print the lexicographic minimum one.
Rikka with Subset
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 658 Accepted Submission(s): 297
Yuta has n
Now, Yuta has got 2n numbers between [0,m] . For each i∈[0,m] , he counts the number of i s 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
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e4+88; typedef long long LL; LL dp[N],B[N]; int a[N]; int main(){ int n,m,T; for(scanf("%d",&T);T--;){ memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); for(int i=0;i<=m;++i) scanf("%I64d",&B[i]); dp[0]=1; for(int i=1;i<=m;++i){ if(dp[i]==B[i]) continue; a[i]=B[i]-dp[i]; for(int j=1;j<=a[i];++j) for(int k=m;k>=i;--k) dp[k]+=dp[k-i]; } int i; for(i=1;i<=m;++i) if(a[i]--) {printf("%d",i);break;} for(;i<=m;++i) while(a[i]--) printf(" %d",i); puts(""); } }
hdu6092 01背包