#1794 : 拼三角形
时间限制:20000ms
单点时限:1000ms
内存限制:256MB
描述
给定 n 根木棍,第 i 根长度为 ai
现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断
请你求出最多能拼出几个
输入
第一行一个正整数 n
第二行 n 个正整数 a1 … an
1 ≤ n ≤ 15
1 ≤ ai ≤ 109
输出
输出最多能拼出几个三角形
样例输入
6 2 2 3 4 5 6
样例输出
2
思路:
预先把合法三角形处理一下,然后状压dp一下。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=(1<<16)+10;
int a[20];
int st[maxn],ans;
int dp[maxn];
int n;
int max_1;
bool pan(int x,int y,int z)
{
if((x+y>z)&&(z-x<y))return 1;
return 0;
}
int main()
{
cin>>n;
ans=0;
max_1=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
{
if(pan(a[i],a[j],a[k]))
{
st[ans++]=(1<<i)|(1<<j)|(1<<k);
}
}
dp[0]=1;
for(int i=0;i<=(1<<n)-1;i++)
{
for(int j=0;j<ans;j++)
{
if(dp[i]&&!(i&st[j]))
{
dp[i|st[j]]=dp[i]+1;
max_1=max(max_1,dp[i]);
}
}
}
cout<<max_1<<endl;
return 0;
}