dp[st]表示完成状态st中的任务所花的最少金钱,然后枚举其中的任务为最后一个来进行转移
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int N;
int num[15][15];
int dp[1<<15];
int DFS( int st ){
if( st == 0 ){
return 0;
}
if( dp[st] != -1 ){
return dp[st];
}
int ans = MAX;
for( int i = 0; i < N; i++ ){
if( ( 1 << i ) & st ){
int temp = 0;
for( int j = 0; j < N; j++ ){
if( ( 1 << j ) & st ){
temp += num[i][j];
}
}
ans = min( ans, DFS( st ^ ( 1 << i ) ) + temp );
}
}
return dp[st] = ans;
}
int main(){
int T, Case = 1;
cin >> T;
while( T-- ){
cin >> N;
for( int i = 0; i < N; i++ ){
for( int j = 0; j < N; j++ ){
cin >> num[i][j];
}
}
memset( dp, -1, sizeof( dp ) );
cout << "Case " << Case++ << ": "<< DFS( ( 1 << N ) - 1 ) << endl;
}
return 0;
}