#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX_P 105
#define MAX_N 105
using namespace std;
int dp[MAX_N][MAX_P];//杀死前i只怪消耗j点耐心值所得到的最大经验书
int e[MAX_N];//杀死一直怪得到的经验数
int p[MAX_N];//杀死一直怪失去的耐心值
int n;//怪物种类的数目
int m;//保留的忍耐度
int k;//表示还需的经验数
int s;//最多的杀怪数
int main()
{
while(cin>>k>>m>>n>>s)
{
for(int i=0;i<n;i++)
{
scanf("%d %d",e+i,p+i);
}
void solve();
solve();
}
}
void solve()
{
//表示消耗j点耐心值的最小杀敌数
int count1[MAX_P];
memset(count1,0,sizeof(count1));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<=m;j++)
{
if(j<p[i])
{
dp[i+1][j]=dp[i][j];
}
else{
if(dp[i][j]<(dp[i+1][j-p[i]]+e[i]))
{
dp[i+1][j]=(dp[i+1][j-p[i]]+e[i]);
count1[j]=count1[j-p[i]]+1;
}
else{
dp[i+1][j]=dp[i][j];
}
}
}
}
bool exit=false;
for(int i=0;i<=m;i++)
{
if(dp[n][i]>=k)
{
if(count1[i]<=s)
{
exit=true;
printf("%d\n",m-i);
break;
}
else{
continue;
}
}
}
if(exit==false)
{
printf("%d\n",-1);
}
}
HDU_2159_背包问题
最新推荐文章于 2019-05-16 22:38:39 发布