本题为二维费用背包。注意事项在代码中
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) #define PINF 0x7FFFFFFF #define NINF -0x7FFFFFFF int n,m,l; int val[105],cost[105],r[105][1005]; int main() { int i,j,t,k,ma; scanf("%d",&t); while(t--) { ma=0; memset(r,-1,sizeof(r));//注意赋值 scanf("%d%d%d",&n,&m,&l); for(i=0;i<n;i++) scanf("%d%d",&cost[i],&val[i]); r[0][0]=0; for(i=0;i<n;i++) { for(k=l;k>=cost[i];k--) for(j=m;j>=1;j--)//降序 { if(r[j-1][k-cost[i]]!=-1)//注意条件 r[j][k]=max(r[j][k],r[j-1][k-cost[i]]+val[i]); } } for(j=0;j<=l;j++) if(r[m][j]>ma)ma=r[m][j];//在r[m][l]=-1时并不表示看不完m部电影。 printf("%d\n",ma); } return 0; }