这道题是二维背包的问题,因为这道题里面有时间l和可选数量m两个约束条件。只要0/1背包的基础上再加上一重循环即可,这题需要注意的是初始化的问题,初始化时只有m=0时dp数组为0,其它置为负数。再一个就是程序第三重循环中的那一个判断,此判断的目的是dp[j][k]的最优子结构是否存在。本题的状态转移方程是: dp[j][k]=max{dp[j][k],dp[j-1][k-dvd[i].time]+dvd[i].value}.
1 #include"iostream" 2 #include"stdio.h" 3 #include"algorithm" 4 #include"string.h" 5 #include"cmath" 6 #define mx 1005 7 using namespace std; 8 struct node 9 { 10 int time; 11 int value; 12 }dvd[mx]; 13 int dp[mx][mx]; 14 int main() 15 { 16 int t,l,n,m; 17 cin>>t; 18 while(t--) 19 { 20 cin>>n>>m>>l; 21 int i,j,k; 22 for(i=1;i<=n;i++) 23 { 24 cin>>dvd[i].time>>dvd[i].value; 25 } 26 memset(dp,-1,sizeof(dp)); 27 for(i=0;i<=l;i++) dp[0][i]=0; 28 for(i=1;i<=n;i++) //物品的种类从0到n-1循环 29 { 30 if(dvd[i].time>l) continue; 31 for(j=m;j>=1;j--) 32 { 33 for(k=l;k>=dvd[i].time;k--) 34 { 35 if(dp[j-1][k-dvd[i].time]!=-1) //这里加上一个判断 36 if(dp[j][k]<dp[j-1][k-dvd[i].time]+dvd[i].value) 37 dp[j][k]=dp[j-1][k-dvd[i].time]+dvd[i].value; 38 } 39 } 40 } 41 if(dp[m][l]!=-1) 42 cout<<dp[m][l]<<endl; 43 else cout<<0<<endl; 44 } 45 return 0; 46 }