我对此任务有疑问。 http://www.spoj.com/problems/LINEUP/看起来很简单,但我的解决方案失败了。我得错了结果。 任何人都可以帮忙解决这个问题吗?非常感谢您的帮助。 : - )
#include <cstdio>
#include <string.h>
using namespace std;
int n;
int prob[21][21];
char vec_rijesio[1<<13];
int memo[1<<13];
int rijesi( int d, int s ) {
if ( d == 11 )
{
return 0;
}
if ( vec_rijesio[s] ) return memo[s];
vec_rijesio[s] = 1;
int &ret = memo[s];
ret = 0;
for ( int i=0; i<11; ++i )
if ( ( s & (1<<i) ) == 0 ) {
int tmp = prob[d][i] + rijesi(d + 1, s|(1<<i));
if ( tmp > ret ) ret = tmp;
}
return ret;
}
int main() {
scanf( "%d", &n );
for(int o=0;o<n;++o)
{
for ( int i=0; i<11; ++i )
for ( int j=0; j<11; ++j ) {
int x;
scanf( "%d", &x );
prob[i][j] = x;
}
int ret = rijesi( 0, 0 );
printf( "%d\n", ret);
memset (memo,0,sizeof(memo));
memset (vec_rijesio,0,sizeof(vec_rijesio));
}
return 0;
}
答案 0 :(得分:1)
问题是分配问题。只是使用匈牙利算法否定优势并最大限度地减少总体弱点。你可以google它。
零强度将成为非常高的正面弱点。
答案 1 :(得分:0)
“所有位置必须被占用,但是,不要将球员置于他们不熟练的位置(即\得分为0)。”
你应该检查一下prob [d] [i]!= 0:
int tmp = prob[d][i] + rijesi(d + 1, s|(1<<i));
其余的似乎都很好。