首页 > 代码库 > hdu 6092 Rikka with Subset(01背包)

hdu 6092 Rikka with Subset(01背包)

题目链接: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背包)