Link: https://www.urionlinejudge.com.br/judge/en/problems/view/1482

The city of Vienna is called the “City of Culture” because (among other things) there are more than 100 museums in the city. As a consequence, it is very difficult (and very expensive) to visit all of them no matter how long you stay in the city. Fortunately, there is a special night, called the “Long Night of Museums”, when you can visit many museums with just one ticket, from 6:00 pm to 1:00 am of the next day.

Nevertheless, it is impossible to visit every museum of the city for two main reasons. First, some museums in Vienna don’t get involved into this event because they close at 5:00 pm. Second, there is not enough time in 7 hours to go to every museum, watch ALL their insides (otherwise, it would be a waste of time), and then go to the others.

Given the number of museums participating in the Long Night of Museums, the time needed to watch the insides of each museum, and the time that it will take to get from each museum to the others, you have to find the best tour to visit as many museums as you can during the Long Night of Museums.

## Input

The input contains several test cases. The first line of a test case contains one integer **N**, which indicates the number of museums participating in the event (1 ≤ **N** ≤ 20). Each museum has a unique identification number ranging from 1 to **N**. The second line of a test case contains **N** integers indicating the time, in minutes, needed to visit each museum, from 1 to **N**. Then there are **N** lines describing the times to go from one museum to every other. The **i**-th line contains **N** integers **Mk** (1 ≤ **k** ≤ **N**) representing the time, in minutes, to go from museum **i** to museum **k**. You may assume that the **i**-th integer in the **i**-th line is equal to zero. The end of input is indicated by **N** = 0.

## Output

For each test case in the input, your program must produce one line containing the maximum number of museums that can be visited during the Long Night of Museums.

Sample Input | Sample Output |

2 500 500 0 120 200 0 2 220 220 0 30 20 0 2 150 150 0 120 200 0 0 |
0 1 2 |

solution:

<br />#include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int mat[20][20], cost[20]; int N, M; #define REP(i, N) for(int (i) = 0; (i) < (N) ; (i) ++ ) int res; bool flag; void back(int last, int remain,int mask, int ans){ res = max(ans, res); if( res == M){ flag = true; return; } REP(i, N){ if(!( mask & ( 1 << i ) )){ if( remain >= cost[i]+mat[last][i]) back(i, remain-cost[i]-mat[last][i], mask|(1<<i), ans+1); } if (flag) return; } } int main(){ int i,j ,k; while(1){ scanf("%i", &N); if(!N) return 0; REP(i, N) scanf("%i", &cost[i]); int aux[20]; REP(i, N) aux[i] = cost[i]; sort(aux, aux+N); int co = 420;M=0; while(M < N && aux[M] <= co ){M++, co-=aux[M];} REP(i, N)REP(j, N) scanf("%i", &mat[i][j]); REP(k, N)REP(i, N)REP(j, N) mat[i][j] = min(mat[i][k]+mat[k][j], mat[i][j]); res = 0; flag = false; REP(i, N){ if( 420 >= cost[i] ){ back(i, 420-cost[i], 1<<i, 1); } if (flag) break; } printf("%i\n", res); } return 0; }