COCI 2006竞赛#1债券任务说明

时间:2014-03-05 03:35:02

标签: c++ algorithm bit-manipulation

任务:http://hsin.hr/coci/archive/2006_2007/contest1_tasks.pdf

我读了解决方案,但我不明白这里显示的任何位操作:

/*
  Croatian Open Competition in Informatics 2006/2007
  Contest 1 - Task BOND
  Programming language C++
*/

#include <cstdio>
using namespace std;

int n;
double prob[21][21];

char vec_rijesio[1<<21];
double memo[1<<21];

double rijesi( int d, int s ) {
   if ( d == n )
      return 1.0;

   if ( vec_rijesio[s] ) return memo[s];
   vec_rijesio[s] = 1;
   double &ret = memo[s];
   ret = 0.0;

   for ( int i=0; i<n; ++i )
      if ( ( s & (1<<i) ) == 0 ) {
         double tmp = prob[d][i] * rijesi(d + 1, s|(1<<i));
         if ( tmp > ret ) ret = tmp;
      }

   return ret;
}

int main() {
   scanf( "%d", &n );

   for ( int i=0; i<n; ++i )
      for ( int j=0; j<n; ++j ) {
         int x;
         scanf( "%d", &x );
         prob[i][j] = x / 100.0;
      }

   double ret = rijesi( 0, 0 );
   printf( "%.6f\n", ret*100.0 );

   return 0;
}

有人可以帮我解释一下代码吗? 1.“1&lt;&lt; 21”是什么意思? 2.在rijesi()里面的for循环中发生了什么? 谢谢。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 1&lt;&lt;&lt; 21&lt; 21 mean 2 ^ 21,使用按位左移操作。
  2.   
  3. 该算法基本上是蛮力和memoization,它尝试为给定的jimmy bond分配每个任务并检查   产生概率并评估它们的最大值。
  4.