• Careercup


    2014-05-02 02:28

    题目链接

    原题:

    I/P: N, k 
    
    O/P: all subset of N with exactly K elements. 
    
    eg: I/p: N = 5, K =3 
    O/p: 
    
    1 2 3 
    1 2 4 
    1 2 5 
    1 3 4 
    1 3 5 
    2 3 4 
    2 3 5 
    3 4 5

    题目:从N个数中选K个,输出所有选法。

    解法:递归解决。

    代码:

     1 // http://www.careercup.com/question?id=6204973461274624
     2 #include <vector>
     3 using namespace std;
     4 
     5 class Solution {
     6 public:
     7     void findKSubsets(int n, int k, vector<vector<int> > &result) {
     8         if (n <= 0) {
     9             return;
    10         }
    11         if (k < 1 || k > n) {
    12             return;
    13         }
    14         
    15         vector<int> subset;
    16         
    17         DFS(0, 0, subset, result, n, k);
    18     }
    19 private:
    20     void DFS(int in, int ik, vector<int> &subset, 
    21              vector<vector<int> > &result, 
    22              const int &n, const int &k) {
    23         if (ik == k) {
    24             result.push_back(subset);
    25             return;
    26         }
    27         
    28         int i;
    29         for (i = in + 1; i <= n - (k - ik) + 1; ++i) {
    30             subset.push_back(i);
    31             DFS(i, ik + 1, subset, result, n, k);
    32             subset.pop_back();
    33         }
    34     };
    35 };
    36 
    37 int main()
    38 {
    39     vector<vector<int> > result;
    40     int n, k;
    41     int i, j;
    42     Solution sol;
    43     
    44     while (scanf("%d%d", &n, &k) == 2 && (n > 0 && k > 0)) {
    45         sol.findKSubsets(n, k, result);
    46         printf("{
    ");
    47         for (i = 0; i < (int)result.size(); ++i) {
    48             printf("    {");
    49             for (j = 0; j < (int)result[i].size(); ++j) {
    50                 printf((j ? ", %d" : "%d"), result[i][j]);
    51             }
    52             printf("}
    ");
    53         }
    54         printf("}
    ");
    55         
    56         for (i = 0; i < (int)result.size(); ++i) {
    57             result[i].clear();
    58         }
    59         result.clear();
    60     }
    61     
    62     return 0;
    63 }
  • 相关阅读:
    蓝牙模块连接后出现ANR,日志记录
    移动基站问题
    从地址栏获取字符串
    jquery升级换代
    手机屏幕的触点
    屏幕翻转后要干什么
    条件判断后吸住底部的总结
    mouseenter 和 mouseleave
    自动垂直居中的js
    数学方法代替浮动解决自动换行排列
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3703608.html
Copyright © 2020-2023  润新知