#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; } |