既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
组合型枚举(排列组合模板({C_{n}}^{m})):
#include <iostream>//排列组合
#include <vector>
using namespace std;
int n, m;
vector<int> chosen;
void calc(int k)
{
if ((chosen.size() > m) || (chosen.size() + n - k + 1) < m)//选太多了,选太少了,chosen.size()表示选了几个
return;
if (k == n + 1)//最后一个数都已经选完了
{
for (int i = 0; i < chosen.size(); i++)
cout << chosen[i]<<" ";//输出第i个为几
cout << endl;
return;
}
chosen.push_back(k);//选数字k
calc(k + 1);//继续往深度遍历
chosen.pop_back();//不选数字k
calc(k + 1);//继续往深度遍历
}
int main()
{
cin >> n >> m;
calc(1);//从一开始
}
排列型枚举(全排列)模板:
#include <iostream>//排列型枚举,全排列
#include <vector>
using namespace std;
int n;
int chosen[20];
int book[20] = { 0 };
void calc(int k)
{
if (k == n + 1)//最后一个数都已经选完了
{
for (int i = 1; i <= n; i++)
cout << chosen[i]<<" ";//输出第i个为几
cout << endl;
return;
}
for (int i = 1; i <= n; i++)
{
if (book[i])//标记是否用过
continue;
book[i] = 1;//标记为用了
chosen[k] = i;//第k个为数字i
calc(k + 1);//继续往深度遍历
book[i] = 0;//回溯,没访问过i
chosen[k] = 0;
}
}
int main()
{
cin >> n;
calc(1);//从一开始
}
题目一(公平抽签 排列组合):
代码:
#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> chosen;
vector<string> name;
void calc(int k)
{
if (chosen.size() > m || chosen.size() + (n - k + 1) < m)//选多了或者选少了,chosen.size()表示选了几个
return;
if (k == n + 1)//最后一个也已经选完了
{
for (int i = 0; i < chosen.size(); i++)
cout << name[chosen[i]-1] << " ";
cout << endl;
}
chosen.push_back(k);//选数字k
calc(k + 1);//继续往深度遍历
chosen.pop_back();//不选数字k
calc(k + 1);//继续往深度遍历
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
string s;
cin >> s;
name.push_back(s);
}
calc(1);
}
题目二(座次问题 全排列):
代码:
#include<iostream>
#include<vector>
using namespace std;
int n;
int chosen[15];
int book[15];//标记是否访问过
string name[15];
void calc(int k)
{
if (k == n + 1)//最后一个数都已经选完了
{
for (int i = 1; i <= n; i++)//输出该排列
{
cout << name[chosen[i] - 1] << " ";//name下标从0开始
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++)
{
if (book[i])//标记是否用过
continue;
book[i] = 1;//标记为用了
chosen[k] = i;//第k个为数字i
calc(k + 1);//继续往深度遍历
book[i] = 0;//回溯,没访问过i
chosen[k] = 0;
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> name[i];
}
calc(1);//从第一个开始
}
题目三(排列序数):
代码:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
N6oby4-1715883148541)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新