该题为二维背包
即比一维多加了一个限制条件,同理可以推至多维即是有多个限制条件
#include <stdio.h>
#include <string.h>
struct node
{
int r,e;
}s[150];
int max(int a,int b)
{
if (a>b)
return a;
else
return b;
}
int main()
{
int n,m,k,a,i,l,j,f[100][100];
while(scanf("%d%d%d%d",&n,&m,&k,&a)!=EOF)
{
for (i=1;i<=k;++i)
{
scanf("%d%d",&s[i].e,&s[i].r);
}
memset(f,0,sizeof(f));
for (i=1;i<=k;++i)
for (l=s[i].r;l<=m;++l)//该循环与下一个循环可以交换
for (j=1;j<=a;++j)
{
f[l][j]=max(f[l-s[i].r][j-1]+s[i].e,f[l][j]);
//f[l][j]表示消耗l忍耐度杀死j只时所获得的价值
//由动态规划可知其等于max(该只未杀时所消耗的忍耐度+杀死该只得到的价值,当前状态)
//可能会觉得用一定的忍耐度不一定能杀死那么多的怪兽,但是在该种情况下,对应的f为0,不会有影响
}
if (f[m][a]<n)
printf ("-1\n");
else
{
for (i=0;i<=m;++i)
if (f[i][a]>=n)
{
printf ("%d\n",m-i);
break;
}
}
}
return 0;
}