题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277
题目描述:
该题的意思就是最多给15个数,将其分成三组,然后每组的数加起来,一共三个数,问能否将该三个数组成一个三角形,
最组成不同的三角形的个数。
表示对这题很无语,一个DFS+判重,判重一直TLE,后面参考了解题报告,直接用set解决,用long long 表示这三个数。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std ;
set<long long> s ;
int n, val[20] ;
bool istriangle(int a, int b, int c){
if( a == 0 || b == 0 || c == 0 )
return false ;
if( a+b > c && a+c > b && b+c > a )
return true ;
return false ;
}
void dfs(int dep, int a, int b, int c){
if( dep == n ){
//只需要取a<=b<=c的值进行判断即可
if( a > b || a > c || b > c ) return ;
if( istriangle(a,b,c) ){
long long tmp = 1000000000000LL*a + 1000000LL*b + c ;
s.insert(tmp) ;
}
return ;
}
dfs( dep+1, a+val[dep+1], b, c ) ;
dfs( dep+1, a, b+val[dep+1], c ) ;
dfs( dep+1, a, b, c+val[dep+1] ) ;
}
int main(){
//freopen("12.in", "r", stdin);
int t ;
scanf("%d",&t) ;
while( t-- ){
scanf("%d",&n) ;
for( int i = 1; i <= n; i++ ){
scanf("%d",&val[i]) ;
}
s.clear() ;
dfs(0,0,0,0) ;
cout << s.size() << endl ;
}
return 0 ;
}