Description
小X學習了dfs,爲了練習搜索,開始給自己出題玩。
玩着玩着,一會把自己難住了,一會又被自己難倒了,真是有趣誒!
小X出的題:
現在有N個不同的正整數,求它們可以組成多少個這樣的集合,滿足:
- 集合內的元素數量S>1
- 集合內任意兩個數的差的絕對值都大於集合內的元素數量。
Input
第一行,一個正整數T(T<=20)表示數據組數。
對於每組數據,有兩行。第一行爲一個正整數N(3≤N≤25),第二行爲N個用空格隔開的正整數xi(xi≤200)。
Output
對於每組數據,輸出一行一個整數表示題中所描述的集合的個數。
Sample Input
1 5 2 3 5 8 1
Sample Output
6
Hint
用dfs搜索,依次枚舉第i個數,當準備加入下一個數時,需要檢查當前的最小間隔是否大於當前的集合數量+1,在dfs時,傳遞一個最小值即可進行判斷。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3fffffff
int a[50];
int ans, n;
void dfs(int pos,int dis,int gap)//dis表示數組中數字個數 gap表示任意兩數之差的最小值 pos表示加入的數的位置
{
if (pos == n - 1 || gap <= dis + 2)return;
for (int i = pos+1; i < n; i++)
{
if (a[i] - a[pos]>dis + 2)
{
dfs(i, dis + 1, min(gap, a[i] - a[pos]));
ans++;
}
}
}
int main()
{
int T;
while (cin >> T)
{
while (T--)
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
ans = 0;
sort(a, a + n);
for (int i = 0; i < n; i++)
dfs(i, 0,INF);
printf("%d\n", ans);
}
}
return 0;
}
/**********************************************************************
Problem: 1973
User: leo6033
Language: C++
Result: AC
Time:84 ms
Memory:2024 kb
**********************************************************************/