【SSL】2021-08-19 1100.神秘数列

原题网址

由于某些原因,这个网址会进不去…

1100.神秘数列 - 原题网址

题目描述

研究中心正在研究一种数列,该数列由整数组成,每次可以对相邻的两个数进行相减操作,并删去这两个数,将运算结果替换进去。直到此数列只剩一个数为止。现在此研究中心欲使此最后剩下的数字为目标数,请你帮助他们完成这个任务。
若此数列为 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=104)
  • E ( 3 ) = { 12 , 6 , − 2 } ( − 2 = 3 − 5 ) E(3)=\{12,6,-2\}(-2=3-5) E(3)={12,6,2}(2=35)
  • 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=128)

格式

输入格式

第一行为 N ( 3 ≤ N ≤ 10 ) N(3\le N\le10) N(3N10),为数列中数的个数 。
第二行为 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值