hdu 6092 Rikka with Subset(01背包)
阿新 • • 發佈:2017-08-08
logs 題解 c++ lld hid printf ems () style
題目鏈接:hdu 6092 Rikka with Subset
題意:
給你n和m,讓你找一個字典序最小的含有n個數的A序列,使得A序列的和為m,
然後給你m+1個數,是A序列所有的集合的和的個數,然後讓你找出這個A序列。
題解:
和題解一樣的思想。
1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int i=(a);i<=(b);++i) 4 using namespace std; 5 typedef long long ll;View Code6 typedef pair<int,int>P; 7 8 const int N=1e4+7; 9 int t,n,m,ed,an[N],cnt; 10 P ans[N]; 11 ll b[N],dp[N]; 12 13 int main(){ 14 scanf("%d",&t); 15 while(t--) 16 { 17 scanf("%d%d",&n,&m); 18 mst(dp,0);dp[0]=1;ed=0; 19 F(i,0,m)scanf("%lld",b+i); 20 F(i,1,m) 21 { 22 if(dp[i]<b[i]) 23 { 24 ans[++ed]=P(i,b[i]-dp[i]); 25 int en=b[i]-dp[i]; 26 F(j,1,en)for(int k=m;k>=i;k--) 27 dp[k]+=dp[k-i]; 28 } 29 } 30 cnt=0; 31 F(i,1,ed) 32 { 33 while(ans[i].second--) 34 an[++cnt]=ans[i].first; 35 } 36 F(i,1,cnt)printf("%d%c",an[i]," \n"[i==cnt]); 37 } 38 return 0; 39 }
hdu 6092 Rikka with Subset(01背包)