HDU - 4277 USACO ORZ
题意:
给你n条篱笆,问你可以组成多少个不同的三角形,一边不同即为不同,需要注意的是n条篱笆一起组成一个三角形,而不是在里面选3条组成一个三角形
解题思路:
利用dfs枚举出所有情况,然后利用set去掉重复的
#include<iostream>
#include<set>
#include<array>
using namespace std;
int n,s[20];
set<array<int,3>> d;
void dfs(int a,int b,int c,int t)
{
if(t==n)
{
if(a+b>c && a+c>b && b+c>a && a<=b && b<=c)
d.insert({a,b,c});
}
else
{
dfs(a+s[t],b,c,t+1);
dfs(a,b+s[t],c,t+1);
dfs(a,b,c+s[t],t+1);
}
}
int main()
{
int T;cin>>T;
while(T--)
{
d.clear();
cin>>n;
for(int i=0;i<n;i++) cin>>s[i];
dfs(0,0,0,0);
cout<<d.size()<<endl;
}
return 0;
}