重点是建立背包模型,确定哪个作为花费,哪个作为收益,
我是将杀怪数量和忍耐度作为容量,经验值作为收益进行背包操作,最后再扫描一遍找到最小的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 107
using namespace std;
int w[MAX];
int c[MAX];
int dp[MAX][MAX];
int main ( )
{
int n,m,k,s;
while ( ~scanf ( "%d%d%d%d" , &n , &m , &k , &s ) )
{
for ( int i = 1 ; i <= k ; i ++ )
scanf ( "%d %d" , &w[i] , &c[i] );
memset ( dp , 0, sizeof ( dp ) );
for ( int i = 1 ; i <= k ; i++ )
for ( int t = 1 ; t <= s ; t++ )
for ( int j = c[i] ; j <= m ; j++ )
dp[j][t] = max ( dp[j][t] , dp[j-c[i]][t-1] + w[i] );
int ans = m+1;
for ( int i = 1 ; i <= m ; i++ )
{
for ( int t = 1 ; t <= s ; t++ )
if ( dp[i][t] >= n )
{
ans = i;
}
if ( ans == i ) break;
}
printf ( "%d\n" , m-ans );
}
}