#include <bits/stdc++.h>
using namespace std;
short W=5000;//Wynik
bitset<30>B;//Mapa miasta
pair<short, short>Zakaz[30];//Zakazane polaczenia
short T[30];//Wartosc miast
short n;//Ile miast
short koszt=5004;
int k;
long long Licz(vector<short>A[], bool B[], short k)
{
long long wynik=0;
B[k]=true;
wynik+=T[k];
for (short i=0; i<A[k].size(); ++i)
if (!B[A[k][i]])
wynik+=Licz(A, B, A[k][i]);
return wynik;
}
bool Find()
{
long long wynik=0;
vector<short>G[30];
bool Meet[30];
for (short i=0; i<n; ++i)
Meet[i]=false;
for (short i=0; i<n-1; ++i)
if (!B.test(i)){
G[Zakaz[i].first].push_back(Zakaz[i].second);
G[Zakaz[i].second].push_back(Zakaz[i].first);
}
for (short i=0; i<n; ++i)
if (Meet[i]==false){
long long x=Licz(G, Meet, i);
if (x<0)
return false;
}
return true;
}
void Upp(int A)//Zwiekszanie bitow
{
if (B[A]==0){
B[A].flip();
return;
}
else{
B[A].flip();
Upp(A+1);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
k=1;
for (int i=1; i<=n-1; ++i)
k=k<<1;
for (short i=0; i<n; ++i)//Zeruj wartosc miast
cin>>T[i];
for (short i=0; i<n-1; ++i){//Wpisz zakazane drogi
Zakaz[i].first=i;
Zakaz[i].second=i+1;
}
for (int i=0; i<k; ++i){//Sprawdz na pale
if (Find()){
koszt=0;
for (int j=0; j<n-1; ++j)
if (!B[j])
++koszt;
W=min(koszt, W);
}
Upp(0);
}
if (W==5000){
cout<<"-1";
return 0;
}
cout<<W;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <bits/stdc++.h> using namespace std; short W=5000;//Wynik bitset<30>B;//Mapa miasta pair<short, short>Zakaz[30];//Zakazane polaczenia short T[30];//Wartosc miast short n;//Ile miast short koszt=5004; int k; long long Licz(vector<short>A[], bool B[], short k) { long long wynik=0; B[k]=true; wynik+=T[k]; for (short i=0; i<A[k].size(); ++i) if (!B[A[k][i]]) wynik+=Licz(A, B, A[k][i]); return wynik; } bool Find() { long long wynik=0; vector<short>G[30]; bool Meet[30]; for (short i=0; i<n; ++i) Meet[i]=false; for (short i=0; i<n-1; ++i) if (!B.test(i)){ G[Zakaz[i].first].push_back(Zakaz[i].second); G[Zakaz[i].second].push_back(Zakaz[i].first); } for (short i=0; i<n; ++i) if (Meet[i]==false){ long long x=Licz(G, Meet, i); if (x<0) return false; } return true; } void Upp(int A)//Zwiekszanie bitow { if (B[A]==0){ B[A].flip(); return; } else{ B[A].flip(); Upp(A+1); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; k=1; for (int i=1; i<=n-1; ++i) k=k<<1; for (short i=0; i<n; ++i)//Zeruj wartosc miast cin>>T[i]; for (short i=0; i<n-1; ++i){//Wpisz zakazane drogi Zakaz[i].first=i; Zakaz[i].second=i+1; } for (int i=0; i<k; ++i){//Sprawdz na pale if (Find()){ koszt=0; for (int j=0; j<n-1; ++j) if (!B[j]) ++koszt; W=min(koszt, W); } Upp(0); } if (W==5000){ cout<<"-1"; return 0; } cout<<W; return 0; } |
English