一道很水的二维DP,但是对于DP没有什么感觉的我来说,真是辛苦了。
这么来。[疲劳值][怪物数量]=经验值。这样保存的当前疲劳值获取的最大经验者。
dp[i][j]=max( dp[i][j],dp[i-m_pl[k]][j-1]+m_exp[k] );
当经验值满足升级的条件就可以了。
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int max( int a,int b ){ return a>b?a:b; }
int main()
{
int exp,pl,n,maxn;
int dp[111][111];
int mexp[111],mpl[111];
while( scanf( "%d%d%d%d",&exp,&pl,&n,&maxn )!=EOF )
{
memset( dp,0,sizeof(dp) );
for( int i=1;i<=n;i++ )
scanf( "%d%d",&mexp[i],&mpl[i] );
int i;
for( i=1;i<=pl;i++ )
{
for( int j=1;j<=maxn;j++ )
for( int k=1;k<=n;k++ )
if( i>=mpl[k] )
dp[i][j]=max( dp[i][j],dp[i-mpl[k]][j-1]+mexp[k] );
if( dp[i][maxn]>=exp )
break;
}
printf( "%d\n",pl-i );
}
return 0;
}