#include<iostream>
int A[101][101];//定义一个数组!
using namespace std;
int main()
{
int i,j,t,n,m,k,s,a,b;
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset(A,0,sizeof(A));//首先赋初值,
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
for(j=b;j<=m;j++)
for(t=1;t<=s;t++)
A[j][t]=(A[j][t]>A[j-b][t-1]+a) ?A[j][t]:A[j-b][t-1]+a;//利用二维背包法,计算出杀第第i敌人是的经验与忍耐度,在比较一前一后的大小!
}
if(A[m][s]>=n)//判断是否达到最大?
{
for(i=0;i<=m;i++)
if(A[i][s]>=n)//判断出第i个敌人是能达到的经验值! (当还少于n时才能够满足条件)!
{
printf("%d\n",m-i);//找出符合题意了!
break;
}
}
else
printf("-1\n");
}
return 0;
}
杭电2159背包问题!
最新推荐文章于 2020-03-06 21:36:11 发布