原题网址
由于某些原因,这个网址会进不去…
题目描述
研究中心正在研究一种数列,该数列由整数组成,每次可以对相邻的两个数进行相减操作,并删去这两个数,将运算结果替换进去。直到此数列只剩一个数为止。现在此研究中心欲使此最后剩下的数字为目标数,请你帮助他们完成这个任务。
若此数列为
12
,
10
,
4
,
3
,
5
{12,10,4,3,5}
12,10,4,3,5,目标数为
4
4
4,
E
(
n
)
E(n)
E(n)表示对第
n
n
n和第
n
+
1
n+1
n+1数进行相减并替换。
- E ( 2 ) = { 12 , 6 , 3 , 5 } ( 6 = 10 − 4 ) E(2)=\{12,6,3,5\}(6=10-4) E(2)={12,6,3,5}(6=10−4)
- E ( 3 ) = { 12 , 6 , − 2 } ( − 2 = 3 − 5 ) E(3)=\{12,6,-2\}(-2=3-5) E(3)={12,6,−2}(−2=3−5)
- E ( 2 ) = { 12 , 8 } ( 8 = 6 − ( − 2 ) ) E(2)=\{12,8\}(8=6-(-2)) E(2)={12,8}(8=6−(−2))
- E ( 1 ) = { 4 } ( 4 = 12 − 8 ) E(1)=\{4\}(4=12-8) E(1)={4}(4=12−8)
格式
输入格式
第一行为
N
(
3
≤
N
≤
10
)
N(3\le N\le10)
N(3≤N≤10),为数列中数的个数 。
第二行为
M
M
M,为目标数 。
以下
N
N
N行每行一个整数,为此数列中的数。
输出格式
一个整数,为可行方案的数量。
样例
输入样例
5
4
12
10
4
3
5
输出样例
3
解题思路
这是一道 d f s dfs dfs(深度优先搜索) 题,每次都要寻找不同的 i i i和 j j j使得 l [ i ] l[i] l[i]和 l [ j ] l[j] l[j]相减,由于 l l l数组是全局变量,因此每次搜索只需要一个参数: i n t d e p int\ dep int dep来计算当前相减操作的次数。
Code
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<windows.h>
#define maxn 10 // 作者标准设置
using namespace std;
int n, m, l[maxn + 1], total, used[maxn + 1];
void init() // 输入
{
cin>>n>>m;
for (int i = 1; i <= n; i ++) cin>>l[i];
}
void dpfs(int dep)
{
if (dep == n)
{
int i;
for (i = 1; i <= n; i ++) if (!used[i]) break; // 找到最后一个数
if (l[i] == m) total ++;
return;
}
for (int i = 1; i < n; i ++) // 每次不同位置选择i
{
while (used[i]) i ++; // 找到i
int j = i + 1;
while (used[j]) j ++; // 找到j
if (j > n) return;
used[j] = 1;
l[i] -= l[j];
dpfs(dep + 1);
l[i] += l[j];
used[j] = 0;
}
}
void oput()
{
cout<<total;
}
int main()
{
init();
dpfs(1);
oput();
return 0;
}
大功告成 ∼ \sim ∼