题目大意
题目链接(外网进不去)
给你一个有
n
n
n(
1
≤
n
≤
10
1\le n\le10
1≤n≤10)个数的数列,以及一个目标数
m
m
m。每次可以对相邻的两个数进行相减操作,并将运算结果替换进去,直到只剩1个数为止,若剩下的那个数为
m
m
m,则为一种方案,输出所有方案总数。
解题思路
这题的数据最多只有10个数,用暴搜也不会超时,所以每次搜索时直接对任意两个数进行相减,直到只剩1个数就可以了。
样例
输入
5
4
12
10
4
3
5
输出
3
代码
#include<iostream>
#include<cstdio>
using namespace std;
int a[20],n,m,ans;
void input(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
}
void dfs(int dep){//dep为当前还剩多少个数
if(dep==1){//如果只剩1个数,那么就判断
if(a[1]==m) ans++;
return;
}
for(int i=1;i<dep;i++){
a[i]=a[i]-a[i+1];//将a[i]替换为a[i]和a[i+1]相减的结果
int x=a[i+1];
for(int j=i+1;j<dep;j++)
a[j]=a[j+1];//将a数组左移一位
dfs(dep-1);
for(int j=dep;j>i;j--)
a[j]=a[j-1];
a[i+1]=x;
a[i]+=a[i+1];
}
}
int main(){
input();
dfs(n);
cout<<ans;
return 0;
}