結果

提出番号 1697
提出者 popo
言語 C++
提出日時 2018-08-04 13:32:18
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 5ms 21024KB
2 AC 100% 4ms 21024KB
3 AC 100% 5ms 21024KB
4 AC 100% 4ms 21008KB
5 AC 100% 4ms 21040KB
6 AC 100% 5ms 21024KB
7 AC 100% 4ms 21024KB
8 AC 100% 7ms 20992KB
9 AC 100% 5ms 21024KB
10 AC 100% 5ms 21040KB
11 AC 100% 5ms 21040KB
12 AC 100% 5ms 21024KB
13 AC 100% 5ms 21024KB
14 AC 100% 5ms 21024KB
15 AC 100% 5ms 21024KB
16 AC 100% 4ms 21024KB
17 AC 100% 4ms 21024KB
18 AC 100% 5ms 21024KB
19 AC 100% 5ms 21024KB
20 AC 100% 6ms 21024KB
21 AC 100% 5ms 21024KB
22 AC 100% 8ms 21024KB
23 AC 100% 4ms 21008KB
24 AC 100% 11ms 21024KB
25 AC 100% 6ms 21024KB
26 AC 100% 7ms 21024KB
27 AC 100% 13ms 21024KB
28 AC 100% 6ms 21024KB
29 AC 100% 49ms 21040KB
30 AC 100% 8ms 21024KB

ソースコード

#include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;

int dp[1<<16][16];
int n,t[55],a[55][55];

int main(){
  cin>>n;
  r(i,n)cin>>t[i];
  r(i,n)r(j,n)cin>>a[i][j];
  r(i,1<<16)r(j,16)dp[i][j]=1e9;
  dp[0][0]=0;
  for(int i=0;i<(1<<n);i++){
    for(int j=0;j<n;j++){
      if(dp[i][j]==1e9)continue;
      for(int k=0;k<n;k++){
        if(i&(1<<k))continue;
        int s=t[k];
        r(l,n)if(i&(1<<l))s-=a[l][k];
        dp[i|(1<<k)][k]=min(dp[i|(1<<k)][k],dp[i][j]+s);
      }
    }
  }
  int ans=1e9;
  r(i,n)ans=min(ans,dp[(1<<n)-1][i]);
  cout<<ans<<endl;
}