这是一道二维费用的背包问题,将dp多开一维,略修改一下状态转移方程即可,即dp[j][k]=get_max( dp[j-1][k-cost[i]]+value[i],dp[j][k])
另外,这道题中,加注释的部分是WA了许多次后参考其他人的解题报告后加上的,暂时还没弄清楚为什么要这样做,这应该是背包的初始化的问题,应该要注意细节,问题留在这里,解决之后再修改解题报告。
#include<stdio.h> #include<string.h> #define INF 10000000 #define MAX_DVD_AMOUNT 110 #define MAX_L 1100 int get_max(int ,int ); int main() { int t; scanf("%d",&t); while(t--) { int i,j,k,n,m,l,cost[MAX_DVD_AMOUNT],value[MAX_DVD_AMOUNT],dp[MAX_DVD_AMOUNT][MAX_L]; scanf("%d%d%d",&n,&m,&l); for(i=1;i<=n;i++) { scanf("%d%d",&cost[i],&value[i]); } for(i=0;i<MAX_DVD_AMOUNT;i++) { for(j=0;j<MAX_L;j++) { if(i==0) /*这里只能让当i=0时才将dp赋为0*/ { dp[i][j]=0; } else { dp[i][j]=-INF; } } } for(i=1;i<=n;i++) { for(j=m;j>0;j--) { for(k=l;k>=cost[i];k--) { if(dp[j-1][k-cost[i]]!=-INF)/*这里必须判断*/ dp[j][k]=get_max( dp[j-1][k-cost[i]]+value[i],dp[j][k]); } } } if(dp[m][l]!=-INF) printf("%d\n",dp[m][l]); else printf("0\n"); } return 0; } int get_max(int x,int y) { return x>=y?x:y; }