2 条题解

  • 1
    @ 2024-2-24 13:25:49
    #include <iostream>
    using namespace std;
    int n, a[21];
    int main()
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 1; i < (1 << n); i++)
        {
            for(int j=0;j<n;j++){
                if(i&(1<<j)){
                    cout<<a[j]<<" ";
                }
            }
            cout << endl;
        }
        return 0;
    }
    
    1. 头文件和命名空间​:
    #include <iostream>  using namespace std;
    

    这部分引入了iostream头文件,以便使用输入输出流(如cincout)。using namespace std;是为了避免在每次使用标准库中的功能时都写std::前缀。

    1. 全局变量​:
    int n, a[21];
    

    这里定义了一个整数n,表示数组a的大小。数组a的大小固定为21,但真正使用的长度由n决定。

    1. 主函数​:
    int main()  {      ...      return 0;  }
    

    程序的执行从这里开始。

    1. 输入数组大小和内容​:
    cin >> n;  for (int i = 0; i < n; i++)      cin >> a[i];
    

    首先,程序从标准输入读取一个整数n,表示数组a的大小。然后,它读取n个整数并存储在数组a中。

    1. 生成并打印所有子集​:
    for (int i = 1; i < (1 << n); i++)  {      for(int j=0;j<n;j++){          if(i&(1<<j)){              cout<<a[j]<<" ";          }      }      cout << endl;  }
    

    这是一个关键部分。1 << n是2的n次方,它表示所有可能的子集数量(包括空集)。这个循环遍历所有这些可能的子集。

    对于每个子集,内部循环检查i的二进制表示中的每一位。如果第j位是1(即i & (1<<j)为真),则打印数组a中的第j个元素。

    例如,假设n=3a={1, 2, 3}。那么i的值将从1到7(即二进制从001111)。对于每个i值,程序将打印a的一个子集。输出将是:

    复制代码1   2   3   1 2   1 3   2 3   1 2 3
    
    1. 结束程序​:
    return 0;
    

    这表示程序成功结束。

    • -1
      @ 2023-12-17 14:32:44
      #include<iostream>
      using namespace std;
      int a[15];
      int main()
      {
          int n;
          cin>>n;
          for(int i=0;i<n;i+=1)cin>>a[i];
          for(int i=1;i<(1<<n);i+=1)
          {
              for(int j=0;j<n;j+=1)if(i&(1<<j))cout<<a[j]<<" ";
              cout<<endl;
          }
      }
      
      • 1

      信息

      ID
      609
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      276
      已通过
      104
      上传者