SYCOJ2197三角形游戏

题目—三角形游戏 (shiyancang.cn)

对于任意的一个数字,把他拆分为n个数字,使得其逐层和为该数字.

首先n很小,所以很可能是搜索。DFS,n回选择。

#include<bits/stdc++.h>
using namespace std;
const int N=20;
bool flag=false;
int a[N],k[N][N],n,sum,st[N]; 
void dfs(int step,int num)
{
	if(flag||num>sum) return;
	if(step==n+1&&num==sum)
	{
		flag=true;
		for(int i=1;i<=n;i++) cout<<a[i]<<(i==n?'\n':' ');
	}
	for(int i=1;i<=n;i++) if(!st[i]) a[step]=i,st[i]=1,num+=k[n][step]*i,dfs(step+1,num),st[i]=0,num-=k[n][step]*i; 
}
int main()
{

	scanf("%d%d",&n,&sum);
	k[1][1]=1;
	for(int i=2;i<=n;i++) for(int j=1;j<=i;j++) k[i][j]=k[i-1][j-1]+k[i-1][j];
	dfs(1,0);
	return 0;
}

对于杨辉三角类型的相加到最后,每一个加的个数是组合数系数。所以每个元素只需要乘以对应的系数即可。

dfs搜索,如果找到了或者不符合要求就退出。搜索到了n+1步,开始判断。

然后打一个循环,所有的选项进行搜索,没有进行过的进行搜索,标记使用过了,然后相加,然后下一步,退回去的时候,返回原样。

搜索,设定退出条件,然后设定判定条件。下面是搜索过程,列出所有的选择,满足条件如何,然后下一步,恢复原样。

 

posted @ 2021-07-13 00:02  mofan552  阅读(44)  评论(0)    收藏  举报