一道很水的二维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;
}