結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8432KB
2 AC 100% 2ms 8416KB
3 AC 100% 2ms 8000KB
4 AC 100% 2ms 7296KB
5 AC 100% 2ms 8112KB
6 AC 100% 2ms 8416KB
7 AC 100% 2ms 7632KB
8 AC 100% 2ms 8016KB
9 AC 100% 2ms 8016KB
10 AC 100% 2ms 8432KB
11 AC 100% 2ms 8192KB
12 AC 100% 2ms 7248KB
13 AC 100% 2ms 7632KB
14 AC 100% 2ms 8720KB
15 AC 100% 2ms 8720KB
16 AC 100% 2ms 7808KB
17 AC 100% 2ms 7552KB
18 AC 100% 2ms 8432KB
19 AC 100% 2ms 7232KB
20 AC 100% 2ms 7648KB
21 AC 100% 2ms 8096KB
22 AC 100% 3ms 8336KB
23 AC 100% 2ms 8736KB
24 AC 100% 4ms 8416KB
25 AC 100% 2ms 8144KB
26 AC 100% 3ms 8064KB
27 AC 100% 5ms 8432KB
28 AC 100% 2ms 8480KB
29 AC 100% 12ms 8720KB
30 AC 100% 2ms 8656KB

ソースコード

#include<bits/stdc++.h>
using namespace std;

int N;
int t[16];
int G[16][16];

int mem[(1<<16)];

int solve(int bit){
  if(bit == (1<<N)-1)return 0;
  if( mem[bit]!=-1 )return mem[bit];
  int res=1e9;
  for(int i=0;i<N;i++){
    if(bit>>i&1)continue;
    int cost=t[i];

    for(int j=0;j<N;j++)
      if(bit>>j&1)
        cost-=G[j][i];

    if(cost<0)cost=0;

    res=min(res, cost + solve( bit | (1<<i) ) );
  }
  return mem[bit]=res;
}

int main(){
  memset( mem, -1 , sizeof(mem));
  cin>>N;
  for(int i=0;i<N;i++)cin>>t[i];
  for(int i=0;i<N;i++)
    for(int j=0;j<N;j++)
      cin>>G[i][j];

  cout<< solve(0) <<endl;
  return 0;
}