HUST Online Judge WebBoard
Problem 1316 >> 状压dp
20220440216 @ 2024-07-26 21:33:07
[ Quote ] [ Edit ] [ Delete ] 1#
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<stack>
#include<queue>
#include<string>
#include<unordered_map>
#include<map>
#include<vector>
#include<set>
//#include<bits/stdc++.h>
#define T int TT;cin>>TT;while (TT--)
#define ll long long
#define rep(i,n) for(ll i=0;i<n;i++)
#define ref(i,n) for(ll i=n-1;i>=0;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const ll LNF = 9223372036854775807;
using namespace std;
ll n, m, k, ans, cnt = 1;
typedef pair<ll, ll>tt;
const ll M = 2e6+10;
ll sum[M];
ll as[21];
ll dp[M],num[M];
int main()
{
IOS;
cin>>n;
rep(i,n)
{
cin>>as[i];
}
for(ll i=1;i<(1<<(n));i++)
{
m=i;
while(m)
{
k=(m)&(-m);
m-=k;
sum[i]+=as[(ll)log2(k)];
++num[i];
}
}
ll ned=sum[(1<<(n))-1]/n;
dp[0]=0;
for(ll i=1;i<(1<<(n));i++)
{
m=i;
dp[i]=1e9;
ll s=(sum[i]!=ned*num[i]);
while(m)
{
k=(m)&(-m);
m-=k;
dp[i]=min(dp[i],dp[i-k]+s);
}
}
cout<<dp[(1<<(n))-1];
}