思路:
深搜,一个一个减。
代码:
#include<cstdio>
int a[101][101];
int total=0,n,m;
void input()//读入
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[n+1][i]);
}
void dfs(int dep)
{
if (dep==1)//如果只剩一个数
{
if (a[2][1]==m) total++;//方案数加一
return;//退出
}
for (int i=1;i<=dep-1;i++)
{
for (int j=1;j<=i-1;j++)
a[dep][j]=a[dep+1][j];//i之前的数列往前推
a[dep][i]=(a[dep+1][i]-a[dep+1][i+1]);//相减
for (int j=i+2;j<=dep+1;j++)
a[dep][j-1]=a[dep+1][j];//i之后的数列往前推
dfs(dep-1);
}
}
int main()
{
input();//读入
dfs(n);//深搜
printf("%d",total);//输出方案数
return 0;
}