当前位置:   article > 正文

深圳技术大学oj C : 生成r子集

深圳技术大学oj C : 生成r子集

Description

输出给定序列按字典序的 � 组合,按照所有 � 个元素出现与否的 01 标记串 ����−1,...,�1 的字典序输出.

此处01串的字典序指:先输入的数字对应低位,后输入的数字对应高位,从高位到低位第一个不一样的位为1的字典序靠后.

Input

第一行集合元素个数 1≤�≤10 及子集元素个数 1≤�≤�,第二行 � 个空格隔开的正整数 1≤��≤100.

Output

每组数据输出所有对应的每个组合,每个一行用空格隔开。

Sample

#0
Input

Copy

5 3
3 1 2 4 5
Output

Copy

3 1 2
3 1 4
3 2 4
1 2 4
3 1 5
3 2 5
1 2 5
3 4 5
1 4 5
2 4 5

Hint

样例中:{3,1,4}表示01011——5(0)4(1)2(0)1(1)3(1),{1,2,5}表示10110——5(1)4(0)2(1)1(1)3(0),则{1,2,5}的字典序比{3,1,4}靠后.

题目有点难懂

方法用回溯求组合数然后排序

  1. #include <iostream>
  2. #include <cstring>
  3. #include <queue>
  4. #include <climits>
  5. #include "vector"
  6. #include "set"
  7. #include "string"
  8. #include "cmath"
  9. #include "algorithm"
  10. using namespace std;
  11. int a[15];
  12. int use[15];
  13. int weight[105];
  14. int n,r;
  15. //3 1 2 4 5
  16. //1 1 1 0 0
  17. //1 1 0 1 0
  18. bool cmp(vector<int>v1,vector<int>v2){
  19. int s1=0,s2=0;
  20. for(int j=n-1;j>=0;j--){
  21. if(std::find(v1.begin(), v1.end(),a[j])!=v1.end()){
  22. s1=1;
  23. }
  24. if(std::find(v2.begin(), v2.end(),a[j])!=v2.end()){
  25. s2=1;
  26. }
  27. if(s1!=s2){
  28. if(s1==0){
  29. return true;
  30. }
  31. else{
  32. return false;
  33. }
  34. }
  35. s1=0,s2=0;
  36. }
  37. }
  38. void backtrack(int a[],int n,int r,vector<int>&temp,vector<vector<int>>&ans){
  39. if(temp.size()==r){
  40. ans.push_back(temp);
  41. return;
  42. }
  43. for(int i=0;i<n;i++){
  44. if(use[i]==0&&((!temp.empty()&&weight[a[i]]<weight[temp[temp.size()-1]])||temp.empty())){
  45. use[i]=1;
  46. temp.push_back(a[i]);
  47. backtrack(a,n,r,temp,ans);
  48. temp.pop_back();
  49. use[i]=0;
  50. }
  51. }
  52. }
  53. int main()
  54. {
  55. while(cin>>n>>r){
  56. memset(use,0, sizeof(use));
  57. for(int i=0;i<n;i++){
  58. cin>>a[i];
  59. weight[a[i]]=n-i;
  60. }
  61. vector<int>temp;
  62. vector<vector<int>>ans;
  63. backtrack(a,n,r,temp,ans);
  64. sort(ans.begin(),ans.end(), cmp);
  65. for(int i=0;i<ans.size();i++){
  66. for(int j=0;j<r;j++){
  67. cout<<ans[i][j]<<" ";
  68. }
  69. cout<<endl;
  70. }
  71. cout<<endl;
  72. }
  73. return 0;
  74. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/774588
推荐阅读
相关标签
  

闽ICP备14008679号