题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4277
解题思路:
题目大意:
给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的?
算法思想:
暴力搜索,令x最大,y次之,z最小,然后进行剪枝,用set判重
AC代码:
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
typedef long long ll;
int n,sum;
set<ll> s;
int a[20];
void dfs(int x,int y,int z,int i){
if(i == n){
if(z > x || z > y || y > x)//剪枝
return;
if(x && y && z && (y+z > x)){
ll tmp = (ll)x*sum*sum+y*sum+z;//一开始我取的是n,然而并没有过,换成sum,才过了。。。
s.insert(tmp);
}
return;
}
dfs(x+a[i],y,z,i+1);
dfs(x,y+a[i],z,i+1);
dfs(x,y,z+a[i],i+1);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
s.clear();
sum = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
sum += a[i];
}
dfs(0,0,0,0);
printf("%d\n",s.size());
}
return 0;
}