SYCOJ2197三角形游戏
对于任意的一个数字,把他拆分为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步,开始判断。
然后打一个循环,所有的选项进行搜索,没有进行过的进行搜索,标记使用过了,然后相加,然后下一步,退回去的时候,返回原样。
搜索,设定退出条件,然后设定判定条件。下面是搜索过程,列出所有的选择,满足条件如何,然后下一步,恢复原样。

浙公网安备 33010602011771号