自己看题目写的,求大佬指点
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[30],f[25][25] = {0},b[25][25];
void dp(int n,int m){//输出矿洞
if(n == 1)cout << 1;
else{
int i;
for(i = 1;i < n; ++i){
if(b[i][n] == (b[n][m] - a[m]))dp(i,n);
}
}
cout << " " << m;
}
int main()
{
int n;
cin >> n;
int i,j,k;
for(i = 1; i <= n; ++i){
cin >> a[i];
}
if(n == 1){//特判
cout << 1 << endl;
cout << a[1];
}
if(n == 2){//特判
int p;
cin >> p;
if(p == 0)cout << 1 << endl << a[1];
else
cout << 1 << " " << 2 << endl << a[1] + a[2];
}
else
{
for(i = 1; i <= n -1; ++i){
for(j = i+1; j <= n;++j){
cin >> f[i][j];
}
}
for(i = 1; i <= n-1; ++i){
for(j = i+1; j <= n;++j){
if(f[i][j]){//可以进入j矿洞
if(i > 1){
int max = 1;
for(k = 1;k < i;++k){//找i矿洞的最大值
if(b[k][i]){
if(b[max][i] < b[k][i])max = k;
}
}
b[i][j] += b[max][i] + a[j];
}
else
b[i][j] += a[i]+a[j];
}
}
}
int max1 = 1,max2 = 1;
for(i = 1; i <= n-1; ++i){//找最大值
for(j = i+1; j <= n;++j){
if(b[max1][max2] <= b[i][j]){
max1 = i;
max2 = j;
}
}
}
dp(max1,max2);
cout << endl;
cout << b[max1][max2];
}
return 0;
}