1. 程式人生 > >hdu 6092 Rikka with Subset(01背包)

hdu 6092 Rikka with Subset(01背包)

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;
6 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 }
View Code

hdu 6092 Rikka with Subset(01背包)