链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2159
思路:
dp[i][k]表示在i忍耐度下杀k只怪所得到的最多经验;
dp[i][k]=max(dp[i][k],dp[i-a[j].w][k-1]+a[j].v)
#include <bits/stdc++.h>
using namespace std;
const int maxn =110;
int dp[maxn][maxn];
int v[maxn],w[maxn];
int main()
{
int n,m,K,s;
while(cin>>n>>m>>K>>s)
{
memset(dp,0,sizeof dp);
int flag = 0;
for(int i=0;i<K;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=m;i++)//忍耐度
{
for(int j=0;j<K;j++)//怪的种数
{
for(int k=1;k<=s;k++)//可杀怪总数
{
if(w[j]<=i)
{
dp[i][k]=max(dp[i][k],dp[i-w[j]][k-1]+v[j]);
}
}
}
if(dp[i][s]>=n)
{
cout<<m-i<<endl;
flag=1;
break;
}
}
if(!flag)
cout<<-1<<endl;
}
return 0;
}