杨辉三角算法
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool visit[20];
int flag = 0;
int yh[13];
int n, sum;//初始第一行有n个数,最后的值为sum
vector<int>a;
/*int ans()
{
int b = a.size();
vector<int>c = a;
vector<int>d;
int num = 0;
while (b - 1)
{
for (int i = 1; i < c.size(); i++)
{
num = c[i] + c[i - 1];
d.push_back(num);
}
c = d;
d.clear();
b--;
}
return c[0];
}*/
void dfs(int t,int k)//深搜到第t个数
{
if (t == n)
{
if (sum == k)
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " ";
}
flag = 1;
}
return;
}
if (k > sum)
return;
for (int i = 1; i <= n; i++)
{
if (flag == 1)
break;
if (!visit[i])
{
visit[i] = 1;
a.push_back(i);
k = k + yh[t]*i;
dfs(t + 1,k);
a.erase(a.end() - 1, a.end());
visit[i] = 0;
k = k - yh[t] * i;
}
}
}
int main()
{
cin >> n >> sum;
yh[0] = yh[n - 1] = 1; //杨辉三角性质,两边都是1
int i;
if (n > 1)
for (i = 1; i * 2 < n; i++)
yh[i] = yh[n - 1 - i] = (n - i)*yh[i - 1] / i; //利用杨辉三角对称性和组合数公式计算
dfs(0,0);
system("pause");
return 0;
}
在这里需要用到杨辉三角算法的打表形式否则会超时
区域块:在广搜的情况下需要找出其相同区域块中相同规律或者相同值的情况并给相同区域块的赋一个值,用以优化算法计算出一个区域块
广搜:搜到的全部放到队列中,根据情况来进行查找。只要找到就放进队列,每次出一次队列知道队列完全为空或者是找到目标为止,其经典算法迷宫和走马可以用几个数组对应存值用以表示方向可优化算法至一个for循环就能考虑多种方向
深搜:用visit数组存放其是否用过或者其他情况注意需要回溯至之前的状态,如果有需要保存的这个条件visit数组可用int定义01代表是否用过,2代表最后需要保留