数位dp没学好~~
假如每一个数放在一个空箱里。
状态10010代表目前第2个数和第5个数在空箱里。
dp[i]:i状态最少需要几个空箱。
dp[i]:所有i状态的子状态最小需要的空箱数。
dp[1]=1;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 24
int a[maxn];
int dp[1<<maxn];
int n;
int have1(int x)
{
x=(x& 0x55555555)+((x>>1)& 0x55555555);
x=(x& 0x33333333)+((x>>2)& 0x33333333);
x=(x& 0x0F0F0F0F)+((x>>4)& 0x0F0F0F0F);
x=(x& 0x00FF00FF)+((x>>8)& 0x00FF00FF);
x=(x& 0x0000FFFF)+((x>>16)& 0x0000FFFF);
return x;
}
int dps(int x,int y)
{
if(dp[x])return dp[x];
int mc=have1(x);
int as=25;
int i,j;
for(i=1;i<y;i++)
{
for(j=1;j<=i;j++)
{
if(a[i]+a[j]==a[y])
{
int nc;
nc=dps(x&(~(1<<(y)))|(1<<(i))|(1<<(j))|(1<<(y-1)),y-1);
as=min(as,max(nc,mc));
}
}
}
dp[x]=as;
return dp[x];
}
int main()
{
int i;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)scanf("%d",&a[i]);
dp[1<<1]=1;
int ans=dps((1<<(n)),n);
if(ans==25)ans=-1;
cout<<ans<<endl;
}
}