题目:打怪升级,有忍耐值,每种怪有上限,和经验,求能否升级。
分析:dp,多重背包。二维多重背包 f[ j ][ k ] = f[ j-b[ i ] ][ k-1 ] + a[ i ]。
说明:作为吾王党,看到Fate就进来了,没我大Saber(~~~~(>_<)~~~~ )。(2011-09-19 09:22)
#include <iostream>
#include <cstdlib>
using namespace std;
int a[ 105 ];
int b[ 105 ];
int f[ 105 ][ 105 ];
int main()
{
int N,M,K,S;
while ( cin >> N >> M >> K >> S ) {
for ( int i = 1 ; i <= K ; ++ i )
cin >> a[ i ] >> b[ i ];
memset( f, 0, sizeof( f ) );
for ( int i = 1 ; i <= K ; ++ i )
for ( int j = b[ i ] ; j <= M ; ++ j )
for ( int k = 1 ; k <= S ; ++ k )
if ( f[ j ][ k ] < f[ j-b[ i ] ][ k-1 ] + a[ i ] )
f[ j ][ k ] = f[ j-b[ i ] ][ k-1 ] + a[ i ];
int flag = -1;
for ( int i = 1 ; i <= M ; ++ i )
for ( int j = 1 ; j <= S ; ++ j )
if ( N <= f[ i ][ j ] && flag < M-i )
flag = M-i;
printf("%d\n",flag);
}
return 0;
}