1973: 給自己出題的小X
Time Limit: 1 Sec Memory Limit: 128 Mb
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
{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.
Source
2017年7月月賽
題目鏈接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1973
題解:這道題,我剛開始看到時第一想到的是用動態規劃來解,想了很久之後,還是沒敲出來,後面看了別人的博客,才知道這題需要用個三維數組來解(如果是使用動態規劃),看了更多地是用DFS搜索來解更簡單易理解。如下是代碼:
AC代碼:
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int a[30],cnt,T,n;
int last,i,min,sum;
void DFS(int last,int i,int sum,int min){
if(i>=n||min<=sum){
return ;
}
if(a[i]-a[last]>sum+1&&min>sum+1){
cnt++;
DFS(i,i+1,sum+1,min<a[i]-a[last]?min:a[i]-a[last]);
}
DFS(last,i+1,sum,min);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int j=0;j<n;j++){
scanf("%d",&a[j]);
}
sort(a,a+n);
cnt=0;
for(int j=0;j<n-1;j++){
DFS(j,j+1,1,INF);
}
printf("%d\n",cnt);
}
return 0;
}