该题为二维背包 即比一维多加了一个限制条件,同理可以推至多维即是有多个限制条件 #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; }