题目描述题目要求生成给定报纸列表的所有指定大小的子集并按字典序输出。输入给出子集大小范围单个数字、两个数字或*表示全部每行一个报纸名。输出按子集大小分组每组内按字典序输出所有子集。输入格式第一行一个整数MMM表示数据集个数后面跟一个空行。每个数据集的第一行是子集大小说明*、n或a b。接下来若干行报纸名以空行结束。两个连续数据集之间由一个空行分隔。输出格式对于每个数据集按子集大小分组输出。每组先输出Size X然后每行一个子集报纸名用逗号加空格分隔。每组后跟一个空行。两个数据集输出间有一个空行。样例输入1 2 3 Times Herald-Tribune Post New Advocate输出Size 2 Times, Herald-Tribune Times, Post Times, New Advocate Herald-Tribune, Post Herald-Tribune, New Advocate Post, New Advocate Size 3 Times, Herald-Tribune, Post Times, Herald-Tribune, New Advocate Times, Post, New Advocate Herald-Tribune, Post, New Advocate题目分析本题的核心是生成组合并按字典序输出。组合生成使用回溯法生成所有大小为kkk的组合按输入顺序依次选择保证字典序。输出格式注意每组输出后有一个空行两个数据集输出间也有一个空行。复杂度分析最多C(12,6)924C(12,6) 924C(12,6)924个组合可接受。代码实现// Bundling Newspapers// UVa ID: 598// Verdict: Accepted// Submission Date: 2016-08-12// UVa Run Time: 0.010s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intpapers[12],used[12],name_count;string names[12];voiddfs(intdepth,intlast,intn){if(depthn){for(inti0;in;i){if(i0)cout, ;coutnames[papers[i]];}cout\n;}else{for(intilast;iname_count-(n-1)depth;i){used[i]1;papers[depth]i;dfs(depth1,i1,n);used[i]0;}}}intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string line;getline(cin,line);intMstoi(line);getline(cin,line);for(intcases1;casesM;cases){if(cases1)cout\n;string range;getline(cin,range);name_count0;while(getline(cin,line),line.length()0)names[name_count]line;inta,b;if(range.front()*)a1,bname_count;else{istringstreamiss(range);issa;if(!(issb))ba;}for(intia;ib;i){coutSize i\n;memset(papers,-1,sizeof(papers));memset(used,0,sizeof(used));dfs(0,0,i);cout\n;}}return0;}